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

2022-09-01 16:00:32

我对Java很陌生,我面临着一个反思问题。

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

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

Object instance = Class.forName("Foobar").newInstance();

假设我知道这个对象上有一个方法(我甚至可以用它来检查),请问如何称呼它?fooMethodClass.forName("Foobar").getDeclaredMethods()


答案 1
Method method = getClass().getDeclaredMethod("methodName");
m.invoke(obj);

这是在方法没有参数的情况下。如果有,请将参数类型作为参数追加到此方法。 是要在其上调用方法的对象。obj

请参阅 java.lang.Class 文档


答案 2

您可以使用反射

样本class

package com.google.util;
class Maths {
  public Integer doubleIt(Integer a) {
    return a*2;
  }
}

并使用类似这样的东西 -

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

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

步骤 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);

步骤 3:- 通过传递 Object 和参数的实例invokeMethod

Object obj2 = method.invoke(obj.newInstance(), id);
//like :- method.invoke(obj.newInstance(), 45);

您也可以像这样执行步骤2

(当您不知道特定方法存在于一个您通过循环方法的数组检查所有方法时)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];
  }
}