使用双重反射物体
Using double-reflected objects
我基本上想做的是在一个对象上调用一个方法,该对象的 class 是用字符串编写并通过 javax.tools.JavaCompiler
编译的
那部分是"easy",我用过类似的东西:https://sites.google.com/site/malenkov/java/081217
然而,我要调用方法的对象是另一个class中的一个字段,也是用 String 编写并通过 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 中的重要代码(又名字符串变量 Class1Content):
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";
当我尝试 运行 第一个代码块时,我在第 Object state = f.get(c2.newInstance());
行遇到异常
Exception in thread "main" java.lang.IllegalArgumentException: Can not
set java.lang.Object field Class1.current to Class2
有什么方法可以实现我想要实现的目标,还是我必须回到绘图板?
谢谢!
MemoryClassLoader
扩展了 ClassLoader
,所以你的两个 类 加载了不同的类加载器。除非您指定了 ClassLoader 之间的某种关系,否则一个加载的 类 不会被另一个看到。我会尝试修改 MemoryClassLoader
以便一个实例可以同时加载 类.
我基本上想做的是在一个对象上调用一个方法,该对象的 class 是用字符串编写并通过 javax.tools.JavaCompiler
编译的
那部分是"easy",我用过类似的东西:https://sites.google.com/site/malenkov/java/081217
然而,我要调用方法的对象是另一个class中的一个字段,也是用 String 编写并通过 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 中的重要代码(又名字符串变量 Class1Content):
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";
当我尝试 运行 第一个代码块时,我在第 Object state = f.get(c2.newInstance());
Exception in thread "main" java.lang.IllegalArgumentException: Can not set java.lang.Object field Class1.current to Class2
有什么方法可以实现我想要实现的目标,还是我必须回到绘图板?
谢谢!
MemoryClassLoader
扩展了 ClassLoader
,所以你的两个 类 加载了不同的类加载器。除非您指定了 ClassLoader 之间的某种关系,否则一个加载的 类 不会被另一个看到。我会尝试修改 MemoryClassLoader
以便一个实例可以同时加载 类.