java反射调用已加载对象的方法

时间:2010-09-10 21:11:41

标签: java reflection jvm classloader

如何使用反射调用已在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”的新实例,为什么我要使用反射?我想念一些东西吗?

由于

6 个答案:

答案 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);

这个你将传递自拍实例并且不会丢失你的价值。