JDK的Proxy类和反射实现简单的代理

    技术2025-03-01  4

    文章目录

    关键信息代码示例

    关键信息

    创建一个代理类的核心方法:

    package java.lang.reflect; Proxy类 public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException

    采用反射进行方法调用:

    Object result = method.invoke(target, args);

    通过方法参数可以看出,如果需要创建一个代理类,必须要有一个目标类,目标类必须实现接口,自定义一个实现InvocationHandler 接口的类。

    代码示例

    package proxy.base; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class DefInvocationHd implements InvocationHandler { private Object target; //target必须从调用者传入 //被代理的实例对象 public DefInvocationHd(Object target) { this.target = target; } public Object getTarget() { return target; } public void setTarget(Object target) { this.target = target; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Do something before"); Object result = method.invoke(target, args); System.out.println("Do something after"); return result; } }

    编写一个代理:

    package proxy.base; import proxy.aop.HelloServeImpl; import proxy.aop.HelloService; import java.lang.reflect.Proxy; public class DefMyProxy { public static void main(String[] args) { HelloService helloService = new HelloServeImpl(); Object obj = Proxy.newProxyInstance(helloService.getClass().getClassLoader(), helloService.getClass().getInterfaces(),new DefInvocationHd(helloService)); HelloService hsp = (HelloService)obj; hsp.sayHello("简单代理"); } }

    运行结果:

    Do something before 简单代理 Do something after
    Processed: 0.016, SQL: 9