D and reflection

Adam D. Ruppe via Digitalmars-d digitalmars-d at puremagic.com
Wed May 7 10:07:39 PDT 2014


On Wednesday, 7 May 2014 at 16:51:10 UTC, amehat wrote:
> D  an not do reflection

It can, but it is different than Java. D can look at class 
members at compile time, and can build up runtime tables, but it 
takes a few tricks to do things like get methods of a derived 
class.

> it is limited to the Run-Time Type Information (RTTI ) 
> (http://dlang.org/traits.html).

That's actually compile time introspection docs, the run time 
stuff is found in http://dlang.org/phobos/object.html#TypeInfo 
(and is useless for looking at methods btw)


To find methods that take two arguments, you'd do something like 
this:

alias helper(alias A) = A; // just to shorten things later

foreach(memberName; __traits(allMembers, YourClass)) {
     alias member = helper!(__traits(getMember, YourClass, 
memberName));
     static if(is(member == function)) {
          import std.traits;
          ParameterTypeTuple!member args;
          static if(args.length == 2) {
                 // found one
                if(memberName == "accessibleProc") {
                    // you can check the name too
                }
          }
     }
}


tbh, I don't know exactly what the Java does but the D things I 
used are documented here: 
http://dlang.org/phobos/std_traits.html#ParameterTypeTuple and 
http://dlang.org/traits.html#allMembers

the sample chapter for my D book isn't available yet :( I covered 
this stuff in more depth there.

But actually calling the member gets a bit tricky since you need 
to attach this to it. You'd do __traits(getMember, 
some_instance_object, memberName)(args...).

That can also be wrapped in a delegate to transform arguments, 
box/unbox, and such generically too, which is probably closer to 
what Java does. I don't think this is in the standard library, 
you'd have to DIY though.


Again, this won't just work with child classes, so it might not 
even be what you need. To work with child classes, you'd want to 
build an array of the delegates for runtime use or something, and 
also generate them for each derived instance in the module that 
defines them.

If this is looking like it might be what you need, I can help 
with that too.


More information about the Digitalmars-d mailing list