2015-01-23 3 views
0

мне нужно выполнить некоторый метод с помощью отраженияОтражение. Выполнение конструктор

метода для выполнения

public void someMethod(int value1, int value2, String str, int value3) 
{ 
    try 
    { 
     // some code 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

Это выполнение код

public static void execute() 
{ 
    try 
    { 
     String   className = "some.class"; 
     String   classPath = "some.pack.name" + ":" + "some.class"; 
     PathClassLoader loader = new dalvik.system.PathClassLoader(classPath, ClassLoader.getSystemClassLoader()); 

     Class   clazz  = Class.forName(className, true, loader); 
     Method   method = clazz.getDeclaredMethod("someMethod", Integer.TYPE, Integer.TYPE, String.class, Integer.TYPE); 
     Object   object = clazz.newInstance(); 

     method.invoke(object, 1, 2, "str", 3); 
    } 
    catch (Throwable e) {e.printStackTrace();} 
} 

Но я получаю ошибку

java.lang.InstantiationException: can't instantiate class someClass; no empty constructor 
at java.lang.Class.newInstanceImpl(Native Method) 
at java.lang.Class.newInstance(Class.java:1208) 

После этого Я проверил конструкторы для someClass и получил это

someClass(android.content.Context,com.android.internal.someClass) 
GenericParameterType 0 - class android.content.Context 
GenericParameterType 1 - interface com.android.internal.someClass.someService 

Возникает вопрос: как выполнить SomeMethod с заданными параметрами и данными общих типов?

ответ

1

Чтобы создать новый экземпляр, когда есть параметрическая конструктор, вам нужно получить конструктор первым, а затем вызвать newInstance() с параметрами в теме.

Если у вас есть класс, у которого конструктор имеет два параметра типов Context и SomeClass, тогда создание этого класса будет выглядеть следующим образом.

Object object = clazz.getDeclaredConstructor(Context.class, SomeClass.class) 
          .newInstance(context, someClass); 
+0

Большое спасибо! Но я забыл: второй параметр - это сервис. Теперь я не знаю мотыгу, чтобы установить второй параметр – XXX

+0

@XXX Service.class? –

1

Вам нужно, чтобы создать конструктор без аргументов в том же классе (SomeClass) как:

public SomeClass() 
    { 
    } 
Смежные вопросы