Java动态代理工具类

//jdk动态代理
public class ProxyInvocationHandlerUtil implements InvocationHandler {

    //被代理的接口
    private Object obj;

    public void setObj(Object obj) {
        this.obj = obj;
    }

    //生成得到代理类
    public Object getProxy(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), obj.getClass().getInterfaces(),this);
    };

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //执行前后可动态添加其他方法,如:执行日志;
        //利用反射执行方法
        Object result = method.invoke(obj,args);
        return result;
    }
}

public static void main(String[] args) {
    //真实角色
    UserImpl userImpl = new UserImpl();
    //代理角色
    ProxyInvocationHandlerUtil pih = new ProxyInvocationHandlerUtil();
    //设置要代理的对象
    pih.setObj(userImpl);
    //动态生成代理类
    User user = (User) pih.getProxy();
    //执行方法
    user.add();
}

Proxy

java在JDK1.5之后提供了一个"java.lang.reflect.Proxy"类,通过"Proxy"类提供的一个newProxyInstance方法用来创建一个对象的代理对象。

static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 

newProxyInstance方法用来返回一个代理对象,这个方法总共有3个参数:

  • ClassLoader loader:用来指明生成代理对象使用哪个类装载器;
  • Class<?>[] interfaces:用来指明生成哪个对象的代理对象,通过接口指定;
  • InvocationHandler h:用来指明产生的这个代理对象要做什么事情。

所以我们只需要调用newProxyInstance方法就可以得到某一个对象的代理对象了。

InvocationHandler

调用处理程序。是一个接口, 这个接口只有一个方法:

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;

当调用代理类的任何一个方法的时候,invoke方法就会被先调用,这个方法总共有3个参数:

  • Object proxy:真实对象(也就是我们要代理的对象)的代理对象,它实际上就是Proxy的newInstance方法返回的对象;
  • Method method:原始对象的方法,要执行的方法;
  • Object[] args:方法参数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值