面试题答案
一键面试- 处理方法参数和返回值:
- 在Java动态代理中,通过
InvocationHandler
的invoke
方法来处理目标方法的调用。invoke
方法的参数args
就是目标方法的参数数组,通过对args
数组中的元素进行操作可以处理方法参数。 - 目标方法的返回值就是
invoke
方法的返回值,直接返回处理后的结果即可。
- 在Java动态代理中,通过
- 处理自定义类型参数的预处理:
- 当目标方法的参数是自定义类型且需要预处理时,可以在
invoke
方法中对args
数组中对应的自定义类型参数进行处理。 以下是相关代码示例:
- 当目标方法的参数是自定义类型且需要预处理时,可以在
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 定义接口
interface Subject {
void doSomething(CustomType param);
}
// 定义自定义类型
class CustomType {
private String data;
public CustomType(String data) {
this.data = data;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
// 目标类实现接口
class RealSubject implements Subject {
@Override
public void doSomething(CustomType param) {
System.out.println("RealSubject: 处理自定义类型参数: " + param.getData());
}
}
// 调用处理器
class DynamicProxyHandler implements InvocationHandler {
private Object target;
public DynamicProxyHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 预处理自定义类型参数
if (args != null && args.length > 0 && args[0] instanceof CustomType) {
CustomType customType = (CustomType) args[0];
customType.setData("预处理后的: " + customType.getData());
}
// 调用目标方法
Object result = method.invoke(target, args);
return result;
}
}
// 测试类
public class DynamicProxyTest {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
InvocationHandler handler = new DynamicProxyHandler(realSubject);
Subject proxy = (Subject) Proxy.newProxyInstance(
realSubject.getClass().getClassLoader(),
realSubject.getClass().getInterfaces(),
handler);
CustomType customType = new CustomType("原始数据");
proxy.doSomething(customType);
}
}
在上述代码中:
Subject
接口定义了目标方法。CustomType
是自定义类型。RealSubject
是目标类,实现了Subject
接口。DynamicProxyHandler
是调用处理器,在invoke
方法中对自定义类型参数进行了预处理,然后调用目标方法并返回结果。DynamicProxyTest
类用于测试动态代理,创建代理对象并调用目标方法,展示了自定义类型参数的预处理过程。