java 类的反射机制调用代参方法

2024-12-14 21:29:56
推荐回答(3个)
回答1:

应该这样定义getDeclaredMethod():getDeclaredMethod(方法名,参数),方法名是一个字符串型的,参数是一个class类型的,
例:getDeclaredMethod("setName",new Class[] {参数类型.class}),有几个参数就写几个.class。
在调用时,用获得的Method的对象来调用invoke方法,
例:Method对象.invoke(你定义类的类对象,new Object[] {参数})。此处传递的参数与上面定义的参数类型相对应

希望能解决你的问题!

回答2:

简单给你个例子:
import java.lang.reflect.Method;

public class CallMethod {
public static void main(String[] args) {
CallMethod call=new CallMethod();
try {
Method method=CallMethod.class.getMethod("sunvins",(Class[])null);
method.invoke(call, (Object[])null);
Method method1=CallMethod.class.getMethod("sunvins1",String.class,int.class);
method1.invoke(call, "smile",7);
Method method2=CallMethod.class.getMethod("sunvins2",(Class[])null);
String s=(String)method2.invoke(call, (Object[])null);
System.out.println(s);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 无参无返回值
*/
public void sunvins(){
System.out.println("---haha");
}
/**
* 带参数
* @param s
* @param i
*/
public void sunvins1(String s,int i){
System.out.println("--s="+s);
System.out.println("--i="+i);
}
/**
* 带返回值的
* @return
*/
public String sunvins2(){
return "well";
}
}

回答3:

这个是源代码 仔细看
public Object invoke(Object obj, Object... args)
throws IllegalAccessException, IllegalArgumentException,
InvocationTargetException
{
if (!override) {
if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
Class caller = Reflection.getCallerClass(1);
Class targetClass = ((obj == null || !Modifier.isProtected(modifiers))
? clazz
: obj.getClass());

boolean cached;
synchronized (this) {
cached = (securityCheckCache == caller)
&& (securityCheckTargetClassCache == targetClass);
}
if (!cached) {
Reflection.ensureMemberAccess(caller, clazz, obj, modifiers);
synchronized (this) {
securityCheckCache = caller;
securityCheckTargetClassCache = targetClass;
}
}
}
}
if (methodAccessor == null) acquireMethodAccessor();
return methodAccessor.invoke(obj, args);
}