如何使用反射调用已在JVM中加载的对象的方法? 我试过了
Class myClass = Class.forName("myClass");
Method m = com.test.class.getDeclaredMethod("getValue",new Class[] {});
Object result = m.invoke(myClass,null);
但我得到 java.lang.IllegalArgumentException:object不是声明类的实例。 我想调用的方法是无效的,即不带参数
更新 我有一个已加载类“A”的应用程序。另一个类“B”将由框架实例化。初始化类“B”时,类“A”已经加载到JVM中。我想从类“A”BUT的加载的实例调用一个方法而不在类“B”中引用“A”。在答案中,似乎我必须在类“B”中创建一个新的“A”实例,但我想要访问已经加载的对象。如果我在“B”中创建“A”的新实例,为什么我要使用反射?我想念一些东西吗?
由于
答案 0 :(得分:11)
您将Class的实例作为Method.invoke(..)
的第一个参数传递,但这是错误的;你想传递你感兴趣的实例。
result = m.invoke(myInstance, null);
答案 1 :(得分:4)
我认为你需要
Class myClass = myObject.GetClass();
Method m = com.test.class.getDeclaredMethod("getValue",new Class[] {});
Object result = m.invoke(myObject,null);
答案 2 :(得分:2)
而不是:
Object result = m.invoke(myClass, null);
您应该传入myClass的实例。非法参数异常是由于调用获取类型为Class的参数而不是类型myClass:
Object result = m.invoke(myInstance, null);
答案 3 :(得分:1)
如果我引用了该对象,为什么我需要使用反射?我想调用一个已经从另一个对象加载到JVM中的对象的方法,而不需要引用它。
当然,您需要一个引用来调用方法,您可以像以下一样使用它:
Object result = m.invoke(myClass.newInstance(),null);
但实例的生命周期取决于您创建它的方式(通常或通过反射)。
答案 4 :(得分:0)
关于invoke
的问题是,如果被调用的方法不需要父类的任何实例变量,那么你不必拥有相关类的确切实例。实际上,您可以将static
修饰符添加到Method
,只需使用null, null, Object[]
调用invoke,它与以下内容相同:
public void methLab(Method m){
try{
m.invoke(m.getDeclaringClass().newInstance(), new Object[0]);
}catch(IllegalAccessException iae){
// The method or parent class is declared private or protected
}catch(IllegalArgumentException iae){
// unsatisfied input parameters ( in this case, no params were passed)
}catch(InstantiationException ie){
// could be several things
}catch(InvocationTargetException it){
// Method specific, exception chain. call: it.getTargetException().
}
}
答案 5 :(得分:0)
我有同样的问题,对于谁知道它,非常简单,如果你在同一个你想要电话的地方上课,那就去做吧:
Object result = m.invoke(this, null);
这个你将传递自拍实例并且不会丢失你的价值。