MST

星途 面试题库

面试题:Java动态代理中反射对方法参数和返回值处理的细节

在Java动态代理中,当通过反射调用目标方法时,如何处理方法的参数和返回值?如果目标方法的参数是自定义类型,并且需要进行一些预处理,该如何实现?请详细阐述并给出相关代码示例。
32.9万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 处理方法参数和返回值
    • 在Java动态代理中,通过InvocationHandlerinvoke方法来处理目标方法的调用。invoke方法的参数args就是目标方法的参数数组,通过对args数组中的元素进行操作可以处理方法参数。
    • 目标方法的返回值就是invoke方法的返回值,直接返回处理后的结果即可。
  2. 处理自定义类型参数的预处理
    • 当目标方法的参数是自定义类型且需要预处理时,可以在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类用于测试动态代理,创建代理对象并调用目标方法,展示了自定义类型参数的预处理过程。