2016-03-19 64 views
2

我想獲得反射類的實例。讓我來解釋:在java中獲取反射類的實例

// Before this, class loading and stuff that are not transcendental for this situation. 
Method executeApp = loadedClass.getMethod("execute", Main.class) 
executeApp.invoke(loadedClassInstance, MAIN); // This "MAIN" is an instance of "Main" class 

而且從另一個程序( 'B' 方案):

public class b { 
    public void execute(net.package.Main instance) { 
    System.out.println(instance.getUserInput()); // Just an example, the point is to get information from the instance 
    } 
} 

的一個更好的例子
我在 'A' 程序中創建一個體現方法的新實例我想要做的是這樣的:http://pastebin.com/61ZR9U0C
我不知道我將如何讓'B'程序瞭解什麼是net.package.Main
任何想法?也許這是不可能的......

+0

看起來你只是要求多態性。 'Main'應該是一個具有公共方法'getUserInput()'的類型,然後你可以調用它。 – markspace

+0

是的,但我的意思是getUserInput()是一種方法,它需要與'A'程序相同的實例,一個例子是從JTextField中提取文本的方法 –

+0

我不是100 %確定你在說什麼,但是如果你想使用反射調用一個方法,你必須有實例和方法,以及方法的任何參數。因此,至少有兩個參數「b.execute()」。 – markspace

回答

1

讓B.execute參數是Object類型 ,這樣你就不會因爲每類 與包名之爭擴展對象

包:計算器

import stackoverflow.somepackage.B; 
class Main{ 

     public String getUserInput(){ 
      return "I 'am user foo"; 
     } 

} 

class A{ 

    public void callB() throws NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException { 
     Class loadedClass = B.class; 
     Method executeApp = loadedClass.getMethod("execute", Object.class); 
     executeApp.invoke(loadedClass.newInstance(),Main.class.newInstance()); 
    } 

} 

包:stackoverflow.somepackage

class B{ 

    public void execute(Object object) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { 
     Class mainClass = object.getClass(); 

     // for your purpose 
     // Method method = mainClass.getMethod("setLabelText", String.class); 
     // String text = "Some Text"; 
     // method.invoke(object, text); 

     // for demonstration 
     Method method = mainClass.getMethod("getUserInput"); 
     System.out.println(method.invoke(object)); 
    } 

} 

包:計算器

public class ReflectionTest { 

    @Test 
    public void callB() throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException { 
     A myA = new A(); 
     myA.callB(); 
    } 


} 

我是用戶foo

+0

問題是'A'和'B'類在不同的文件中。看看我回復@markspace的pastebin。 –

+0

所以A和B是在不同的包 – jam

+0

是的,他們是。那就是問題所在。 –