专业的JAVA编程教程与资源

网站首页 > java教程 正文

java动态代理的实现(java动态代理实现三种方式)

temp10 2024-10-04 12:32:59 java教程 11 ℃ 0 评论

什么是动态代理

所谓的动态代理,就是能动态地根据你传入的需要被代理对象,生成一个代理对象。当你调用被代理的对象的方法时,会通过反射,执行该代理对象的方法,同时会对该方法进行增强。也就是在该方法执行前或执行后,执行预先设置好的代码。


java动态代理的实现(java动态代理实现三种方式)

代码实现

由于动态代理的对象需要一个接口,因此首先需要创建一个接口

interface Hello{
    void print();
}

然后定义实现类

class HelloImp implements Hello{
    public void print(){
        System.out.println("你好呀");
    }
}

我们需要定义一个类对被代理对象方法调用前后进行增强处理。这个类需要实现InvocationHandler接口这个类需要重写invoke方法

class InvoImp<T> implements InvocationHandler
@Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //利用反射通过方法名对方法进行调用
        method.invoke(proxyobj,args);
        System.out.println("代理输出");
        return proxy;
    }

method.invoke是通过反射执行代理方法。如果代码写在method.invoke前,则会在方法执行前调用;如果放在method.invoke后,则会在方法执行后调用

我们还需要写一个方法,该方法接受被代理对象,然后返回一个代理对象。

 public  Object bind(T obj){
        //绑定被代理的对象
        this.proxyobj = obj;
        //返回代理对象
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
    }

测试运行

//创建被代理对象
HelloImp hello = new HelloImp();
//创建代理对象处理器
InvoImp invoImp = new InvoImp();
//获取代理对象
Hello helloproxy = (Hello) invoImp.bind(hello);
//执行方法
helloproxy.print("你好");

执行结果


可以看到,由于“代理输出”放在method.invoke后,因此,执行完print方法后,才会输出“代理输出”

完整代码

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

public class test {
    public static void main(String[] args) {
        HelloImp hello = new HelloImp();
        InvoImp invoImp = new InvoImp();
        Hello helloproxy = (Hello) invoImp.bind(hello);
        helloproxy.print("你好");
    }
}

class InvoImp<T> implements InvocationHandler{

    Object proxyobj;
    public  Object bind(T obj){
        //绑定被代理的对象
        this.proxyobj = obj;
        //返回代理对象
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
    }

    /**
     *
     * @param proxy 被代理的对象
     * @param method  调用的方法
     * @param args  方法参数
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //利用反射通过方法名对方法进行调用
        method.invoke(proxyobj,args);
        System.out.println("代理输出");
        return proxy;
    }
}

class HelloImp implements Hello{
    public void print(String content){
        System.out.println("你好呀" + content);
    }
}

interface Hello{
    void print(String content);
}

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表