2013-04-25 2 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

Вы не можете получить доступ к 'Class'es, которые являются частью другого Android приложения. Подумайте о том, чтобы сделать вышеупомянутый класс «службой» и общаться через «Intent's». – afk5min

+0

Точно не приложение, а структура! Доступны методы. Спасибо – Vamsi

ответ

-1

Я нашел решение и его, как показано ниже

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

Как вы могли вызвать newInstance для обработчика, который имеет тип ABCinfo? Конструктор для ABCinfo является закрытым, и вы не можете создать экземпляр этого класса. Ваше решение не будет работать и не будет работать, если вы не внесли некоторые изменения в ABCinfo. – TechCrunch

+1

Ваш фактический код с передачей "b" вместо handler.newInstance() работал для меня. – TechCrunch