手写简易JDK动态代理

现在有一个需求:在执行DemoImpl类的方法前后打印日志。你如何在不修改已有代码的前提下,完成这个需求?

当然静态代理、JDK动态代理、cglib动态代理都能实现,这里我们只用JDK动态代理实现
编写JDK动态代理基本步骤如下:

  1. 编写需要被代理的接口和类
  2. 编写代理类使用JDK自带Proxy类的newProxyInstance()方法获取代理类
  3. 使用代理类执行目标类(被代理类)的方法

DemoInterface接口:

public interface DemoInterface {
    void hello(String msg);
    String goodBye(String msg);
}

DemoImpl类:

public class DemoImpl implements DemoInterface{

    @Override
    public void hello(String msg) {
        System.out.println("msg = " + msg);
    }
        @Override
    public String goodBye(String msg) {
        System.out.println("msg = " + msg);
        return "这是goodbye方法的return";
    }
}

当然静态代理、JDK动态代理、cglib动态代理都能实现,这里我们只用JDK动态代理实现
我们在DemoImpl类相同包下创建ProxyTest类:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyTest {
    public static void main(String[] args) {
        DemoImpl demo = new DemoImpl();//实例化被代理对象(目标对象)
        DemoInterface proxy = (DemoInterface)getProxy(demo);//获取代理对象。因其返回问Object对象需要强制转型
        proxy.hello("hello world!");//代理对象执行目标对象里面的需要被代理的方法
        String s = proxy.goodBye("goodbye world!");//另一个有返回值的方法
        System.out.println(s);//输出返回值
    }
    //获取代理对象
    private static Object getProxy(DemoImpl target){//接收目标对象并返回代理对象
    /*
		使用Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)方法动态创建代理类对象。
		newProxyInstance方法有三个参数:
		loader: 用哪个类加载器去加载代理对象
		interfaces:动态代理类需要实现的接口
		h:动态代理方法在执行时,会调用h里面的invoke方法去执行
    */
        Object proxyInstance = Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(), 
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("调用方法前...");
                        Object returnValue = method.invoke(target, args);//通过反射执行方法
                        System.out.println("调用方法后...");
                        return returnValue;
                    }
                }
        );
        return proxyInstance;
    }
}

运行结果如下:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值