Java 使用双反射对象

Java 使用双反射对象,java,reflection,java-compiler-api,Java,Reflection,Java Compiler Api,我基本上是在一个对象上调用一个方法,该对象的类是用字符串编写的,并通过javax.tools.JavaCompiler 这部分很简单,我用了类似的方法: 然而,我想调用方法的对象是另一个类中的字段,它也是用字符串编写的,并通过JavaCompiler编译。我得到的是: MemoryClassLoader mcl1 = new MemoryClassLoader("Class1", Class1Content); MemoryClassLoader mcl2 = new MemoryClassLo

我基本上是在一个对象上调用一个方法,该对象的类是用字符串编写的,并通过
javax.tools.JavaCompiler

这部分很简单,我用了类似的方法:

然而,我想调用方法的对象是另一个类中的字段,它也是用字符串编写的,并通过JavaCompiler编译。我得到的是:

MemoryClassLoader mcl1 = new MemoryClassLoader("Class1", Class1Content);
MemoryClassLoader mcl2 = new MemoryClassLoader("Class2", Class2Content);
Class c1 = mcl1.loadClass("Class1");
Class c2 = mcl2.loadClass("Class2");
Field f = c1.getDeclaredField("current"); //current should be of type Class2
Object obj = f.get(c2.newInstance()); //trying to cast the Field to type Class2 so I can invoke Class2 methods on it
Method m = c2.getDeclaredMethod("Class2Method");
System.out.println(m.invoke(obj));
Class1中的重要代码(也称为字符串变量ClassContent):

当我尝试运行第一个代码块时,我在第
objectstate=f.get(c2.newInstance())行得到一个异常

线程“main”java.lang.IllegalArgumentException中出现异常:无法 将java.lang.Object字段Class1.current设置为Class2

我有什么办法可以实现我想要实现的目标,或者我必须回到绘图板上来吗?

谢谢

MemoryClassLoader
扩展了
ClassLoader
,因此您的两个类使用不同的类加载器加载。除非您在类加载器之间指定了某种关系,否则一个加载的类将不会被另一个加载的类看到。我会尝试修改
MemoryClassLoader
,这样一个实例可以同时加载两个类。

MemoryClassLoader
扩展了
ClassLoader
,因此您的两个类都加载了不同的类加载器。除非您在类加载器之间指定了某种关系,否则一个加载的类将不会被另一个加载的类看到。我将尝试修改
MemoryClassLoader
,以便一个实例可以加载这两个类。

MemoryClassLoader
是来自链接的吗?
MemoryClassLoader
是来自链接的吗?
Class1Content = "public MemoryClassLoader mcl = new MemoryClassLoader(\"" + "Class2" + "\", Class2Content);\n" +
                "Class c = mcl.loadClass(\"" + "Class2" + "\");\n" +
                "public Object current;\n" + //the object I will try to invoke a method on
                "public Class1()throws Exception{\n" +
                "Field f = c.getDeclaredField(\"initialState\");" + // initialState is the name of the field in Class2 I'm trying to have in Class1
                "current = f.get(c.newInstance()); c.cast(current);\n" +
                "}\n";