[英]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.