代码之家  ›  专栏  ›  技术社区  ›  Cratylus

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

  •  4
  • Cratylus  · 技术社区  · 14 年前

    如何调用已使用反射加载到JVM中的对象的方法? 我试过了

    Class myClass = Class.forName("myClass");
    Method m = com.test.class.getDeclaredMethod("getValue",new Class[] {});
    Object result = m.invoke(myClass,null);
    

    但我明白了 . 我要调用的方法是void,即不接受参数

    更新 我有一个应用程序已经加载了类“a”。另一个类“B”将由一个框架实例化。初始化类“B”时,类“A”已经加载到JVM中。我想从中调用一个方法 加载的实例

    谢谢

    6 回复  |  直到 14 年前
        1
  •  12
  •   Vojtěch Dohnal    10 年前

    将类的实例作为第一个参数传递给 Method.invoke(..) ,但这是错误的;您希望传递您感兴趣的实例。

    result = m.invoke(myInstance, null);
    
        2
  •  4
  •   µBio    14 年前

    我想你需要

    Class myClass = myObject.GetClass();
    Method m = com.test.class.getDeclaredMethod("getValue",new Class[] {});
    Object result = m.invoke(myObject,null);
    
        3
  •  2
  •   Connor M    14 年前

    而不是:

    Object result = m.invoke(myClass, null);
    

    实例

    Object result = m.invoke(myInstance, null);
    
        4
  •  1
  •   DisplayName Je Wade Muchkla L    12 年前

    如果我引用了对象,为什么我需要使用反射?我想调用一个对象的方法,该对象已经从另一个对象加载到JVM中,而没有对它的引用。

    当然,您需要一个引用来调用一个方法,您可以像这样使用它:

    Object result = m.invoke(myClass.newInstance(),null);
    

        5
  •  0
  •   Gilles 'SO- stop being evil'    13 年前

    关于 invoke ,即如果所调用的方法不需要父类的任何实例变量,则不必拥有所讨论的类的确切实例。事实上,你可以添加 static Method 打电话给invoke null, null, Object[] 与以下内容相同:

    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().
      }
    }
    
        6
  •  0
  •   willome    5 年前

    Object result = m.invoke(this, null);
    

    具有 您将通过selfie实例,并且不会丢失您的值。