在Java中获取一个反射类的实例

3

我希望获取一个反射类的实例。让我解释一下:
在程序'A'中,我创建了一个反射方法的新实例:

// 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
  }
}

我尝试做的更好的例子是这个:http://pastebin.com/61ZR9U0C
我不知道如何让'B'程序理解什么是net.package.Main。
有任何想法吗?也许这是不可能的...

看起来你只是在询问多态性。Main 应该是一个具有公共方法 getUserInput() 的类型,然后你调用它。 - markspace
是的,但我所指的getUserInput()是一个方法,它需要在与“ A”程序相同的实例中,例如从JTextField中提取文本的方法。 - jlxip
我不完全确定你的意思,但如果你要使用反射调用一个方法,你必须拥有实例和方法,以及方法的任何参数。因此,在b.execute()中至少需要两个参数。 - markspace
@markspace 当然,我知道这个,但我想要'B'程序在同一个实例中从'A'程序请求数据。也许我表达不太清楚... 这个示例应该很容易理解:http://pastebin.com/61ZR9U0C - jlxip
命令模式有帮助吗? - Bohemian
1个回答

2

让B.execute中的参数类型为Object,这样您就不必为包名称而烦恼,因为每个类都继承自Object。

包:stackoverflow

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());
    }

}

package: 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));
    }

}

包:stackoverflow

public class ReflectionTest {

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


}

我是用户foo


问题在于'A'和'B'类位于不同的文件中。请查看我回复@markspace的pastebin。 - jlxip
是的,它们是。这就是问题所在。 - jlxip
我的意思是,现在在我的例子中它们位于不同的包中。 - jam
在'B'程序中使用导入是个好主意,但正如我之前所说,‘A’和‘B’位于不同的jar文件中,因此我无法导入stackoverflow.Main。是否可能使用反射导入? - jlxip
Buff,我认为这个主题很复杂难以解释... 'B'程序不知道它从哪里调用。在我的情况下,'A'是一个程序,而'B'是'A'的扩展。所以我想要的是从'A'程序中调用'B'程序,并让'B'程序更改'A'程序的数据(例如JLabel文本)。 - jlxip
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接