反射。执行构造函数

Reflection. Execution constructor

我需要通过反射执行一些方法

执行方法

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?

您需要在与以下相同的 class (SomeClass) 中创建无参数构造函数:

public SomeClass()
  {
  }

在有参数化构造函数的情况下要创建新实例,您需要先获取构造函数,然后使用参数调用newInstance()

如果你有一个 class 构造函数有两个类型为 ContextSomeClass 的参数,那么这个 class 的实例化将如下所示。

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