用Java反射如何实例化一个新对象,然后调用一个方法呢?

Vin*_*nzz 20 java reflection

我是Java的新手,我正面临一个反思问题.

假设我必须fooMethod在类的实例上动态调用该方法Foobar

到目前为止,我得到了一个例子Foobar:

Object instance = Class.forName("Foobar").newInstance();
Run Code Online (Sandbox Code Playgroud)

假设我知道fooMethod这个对象有一个方法(我甚Class.forName("Foobar").getDeclaredMethods()至可以查看),请问如何调用它?

Boz*_*zho 9

Method method = getClass().getDeclaredMethod("methodName");
m.invoke(obj);
Run Code Online (Sandbox Code Playgroud)

这是因为该方法没有参数.如果有,则将参数类型作为参数附加到此方法. obj是您调用方法的对象.

请参阅java.lang.Class文档


Nir*_*hra 6

你可以使用反射

样本 class

package com.google.util;
class Maths {
  public Integer doubleIt(Integer a) {
    return a*2;
  }
}
Run Code Online (Sandbox Code Playgroud)

并使用这样的东西 -

步骤 1 :-class使用给定的输入名称加载String

Class<?> obj = Class.forName("Complete_ClassName_including_package");
//like:- Class obj = Class.forName("com.google.util.Maths"); 
Run Code Online (Sandbox Code Playgroud)

第 2 步:- 获取Method给定的名称和参数类型

Method method = obj.getMethod("NameOfMthodToInvoke", arguments);
//arguments need to be like- `java.lang.Integer.class`
//like:- Method method= obj.getMethod("doubleIt", java.lang.Integer.class);
Run Code Online (Sandbox Code Playgroud)

第 3 步:-invoke Method通过传递对象和参数的实例

Object obj2 = method.invoke(obj.newInstance(), id);
//like :- method.invoke(obj.newInstance(), 45);
Run Code Online (Sandbox Code Playgroud)

你也可以这样做第 2 步

(当您不知道特定方法存在于 a 中时,class您可以通过循环方法的数组来检查所有方法)

Method[] methods = obj.getMethods();

Method method = null;

for(int i=0; i < methods.length(); i++) {
  if(method[1].getName().equals("methodNameWeAreExpecting")) { 
    method = method[i];
  }
}
Run Code Online (Sandbox Code Playgroud)


Mic*_*mlk 5

纯粹的反射:Method.invoke。另一种解决方案是要求您反射性创建的项目实现已知接口并转换为该接口并正常使用。

后者常用于“插件”,前者使用频率不高。