2013-04-25 48 views
1

我有一個下面的類:調用使用反射在Singleton類的方法在Java

Public class ABCinfo { 
    private static ABCinfo instance = null; 
    Public static ABCinfo getInstance(Param param); // get instance 
    Private ABCinfo(Param); // making a Singleton class 
    Public void methodA(Param1 param1); // need to invoke this method 
} 

在Java中使用反射,我怎樣才能調用methodA()。 基本上我正在編寫一個Android應用程序,我想在手機中已經存在的應用程序(假設它將一直存在)。

以下是我已經試過的東西:

String apkName = activity.getPackageManager().getApplicationInfo(packageName, 0).sourceDir; 

PathClassLoader myPathClassLoader = 
    new dalvik.system.PathClassLoader(
    apkName, 
    ClassLoader.getSystemClassLoader()); 

Class<?> handler = Class.forName(className, true, myPathClassLoader); 
Method m0 = handler.getDeclaredMethod("getInstance", new Class[] { Param.class }); 
m0.setAccessible(true); 
Object b = m0.invoke(null, new Object[]{ Param}); 
Method m = handler.getMethod("methodA", new Class[] { Param1.class}); 
Param1 methodParameter = "asdf"; 
Object b1 = m.invoke(b, new Object[] { methodParameter }); 

但它仍然沒有工作。

+1

您不能訪問'是另一個Android應用程序的一部分Class'es。考慮將上述類作爲「Service」並通過「Intent」進行通信。 – afk5min 2013-04-25 12:30:06

+0

恰好不是應用程序,而是一個框架!這些方法是可訪問的。謝謝 – Vamsi 2013-04-25 12:55:18

回答

-1

我找到了解決辦法和它類似下面

Object b1 = m.invoke(handler.newInstance(), new Object[] { methodParameter }); 
+0

你怎麼能夠在ABCinfo類型的處理程序上調用newInstance? ABCinfo的構造函數是私有的,你不能實例化這個類。除非您在ABCinfo中做了其他更改,否則您的解決方案不會工作,也不會工作。 – TechCrunch 2015-03-27 22:54:28

+1

你的實際代碼與傳遞「b」而不是handler.newInstance()爲我工作。 – TechCrunch 2015-03-27 23:05:39