用动态代理Proxy实现类似于切面

代理类是Proxy。
然后我们要实现类似于切面就是说在已确定实现类的情况下在某方法里面加入更多的东西(不修改原来的东西,仅拿到的对象有修改)。
主角方法:

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

第一个参数就是当前main方法所在类的类加载器ClassLoader. 第二个就是某类的接口的class属性。第三个参数我们需要创建这个接口的实现类,实现它的invoke方法。

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

然后里面的method有个invoke(Object obj,Object[] args)方法,我们一定要执行到这个方法,也就是调用对象的方法。然后在前面和后面分别写逻辑代码,就像切面一样。
要注意 newProxyInstance返回的对象就是接口的对象。然后我们传入InvocationHandler h对象的时候,要有构造方法,要把某接口的实现类传入。
在 InvocationHandler的实现类里面我们要创建有参构造方法,传入接口对象.

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

这个方法的返回值是Object obj=method.invoke(?,?);

总结代码:

public interface UserDAO {
    public void add();
    public void update();
}

public class UserDAOimpl implements UserDAO {
    @Override
    public void add() {
        System.out.println("现在正在执行add方法。。。");
    }

    @Override
    public void update() {
        System.out.println("现在正在执行update方法。。。");
    }
}

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

public class Main {

    public static void main(String[] args) {
        UserDAO userDAO=new UserDAOimpl();
        Class[] classes={UserDAO.class};
        userDAO=(UserDAO) Proxy.newProxyInstance(Main.class.getClassLoader(),classes,new inno(userDAO));
        userDAO.add();
    }
}
class  inno implements InvocationHandler{
    Object object;
    public inno(Object obj) {
        this.object=obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("现在正在执行代理了");
        Object obj=method.invoke(object ,args);
        System.out.println("代理执行结束!");
        return obj;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值