Re: Reflection: discovering the implementations of an interface
z-man wrote:
This way it should be possible to retrieve dynamically-generated classes
too, shouldn't it?
Of course, it should.
See the output of running the following agent:
import java.lang.instrument.Instrumentation;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Arrays;
/**
* After building agent's jar with duly manifest run it with:
* java -javaagent:agent.jar ClassesAgent
*
* @author pk
*/
public class ClassesAgent {
private static Instrumentation inst;
public static void premain(String agentArgs, Instrumentation inst) {
ClassesAgent.inst = inst;
}
public static Class[] getAllClassesAssignableFrom(Class...
interfaces) {
ArrayList<Class> found = new ArrayList<Class>();
loop: for (Class c : inst.getAllLoadedClasses()) {
for (Class<?> ic : interfaces)
if (!ic.isAssignableFrom(c))
continue loop;
found.add(c);
}
return found.toArray(new Class[found.size()]);
}
interface Test {}
public static void main(String[] args) throws Exception {
System.out.println("lookup of classes implementing " +
Test.class + "...");
Class[] classes;
classes = getAllClassesAssignableFrom(Test.class);
System.out.println("classes found: " + Arrays.toString(classes));
Class tic = Proxy.getProxyClass(
Test.class.getClassLoader(), Test.class);
System.out.println("just generated: " + tic);
classes = getAllClassesAssignableFrom(Test.class);
System.out.println("classes found: " + Arrays.toString(classes));
}
}
piotr