2015-03-13 6 views
1

То, что я в основном пытаюсь сделать, это вызвать метод объекта, класс которого написан в строке и скомпилирован через javax.tools.JavaCompiler
Эта часть «проста», я использовал нечто похожее на это: https://sites.google.com/site/malenkov/java/081217Использование объектов с двойным отражением

Однако объект, который я хочу вызвать метод on, является полем в другом классе, также записанным в 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());

Исключение в потоке "основной" java.lang.IllegalArgumentException: Может не набор java.lang.Object поле Class1.current к class2

Есть ли способ сделать то, что я пытаюсь достичь, или мне нужно вернуться к чертежной доске?
Спасибо!

+0

'MemoryClassLoader' является лицом ссылки? –

+0

Да, это тот – Vlad

ответ

4

MemoryClassLoader удлиняет ClassLoader, поэтому ваши два класса загружаются различными ClassLoaders. Если вы не указали какую-либо связь между ClassLoaders, классы, загруженные одним, не будут видны другим. Я бы попытался изменить MemoryClassLoader так, чтобы один экземпляр мог загружать оба класса.