簡體   English   中英

java反射調用已加載對象的方法

[英]java reflection call methods of an already loaded object

如何使用反射調用已在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不是聲明類的實例 我想調用的方法是void,即不接受參數

更新我有一個已加載類“A”的應用程序。 另一個類“B”將由框架實例化。 初始化類“B”時,類“A”已經加載到JVM中。 我想從類“A”BUT的加載實例中調用一個方法而不在類“B”中引用“A”。 在答案中,似乎我必須在類“B”中創建一個新的“A”實例,但我想要訪問已經加載的對象。 如果我在“B”中創建“A”的新實例,為什么我要使用反射? 我想念一些東西嗎?

謝謝

您將Class的實例作為Method.invoke(..)的第一個參數傳遞,但這是錯誤的; 你想傳遞你感興趣的實例。

result = m.invoke(myInstance, null);

我想你需要

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

代替:

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

你應該傳入myClass的一個實例 非法參數異常是由於調用獲取類型為Class的參數而不是類型myClass:

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

如果我引用了該對象,為什么我需要使用反射? 我想調用一個已經從另一個對象加載到JVM中的對象的方法,而不需要引用它。

當然,你需要一個引用來調用一個方法,你可以使用它:

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

但是實例的生命周期取決於你如何創建它(通常或通過反射)。

我有同樣的問題,對於誰知道它,非常簡單,如果你在同一個地方,你想要呼叫,做到這一點:

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

有了這個,你將傳遞自拍實例,不要丟失你的價值觀。

關於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().
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM