动态代理的例子

本文通过一个案例介绍了Java动态代理的概念,展示了如何通过动态代理实现对数据操作的权限控制与日志记录的分离。在用户接口基础上,创建了一个实现了用户接口的类,并利用Java的Proxy类和InvocationHandler接口,动态生成代理对象。在运行时,代理对象在调用实际方法前后添加了额外的操作,如记录操作日志,实现了业务逻辑与日志记录的解耦。
摘要由CSDN通过智能技术生成

什么是动态代理呢?

我们先来说一个案例,假设现在存储了一些数据,我们对数据有增删改查这四种权限,当我们操作后需要留下记录,如果将增删改查写成四个方法,那我们是不是还需要在这四个方法里再添加我们的操作记录,有没有什么办法可以让我的权限与这些记录分开呢?

动态代理实现:

先写用户接口

public interface UserImp{
    public abstract void add();
    public abstract void delete();
    public abstract void update();
    public abstract void select();
}

实现接口:
 

public class User implements UserImp{
    @Override
    public void  add(){
        System.out.println("添加数据");
    }
    @Override
    public void  delete(){
        System.out.println("删除数据");
    }
    @Override
    public void update(){
        System.out.println("修改数据");
    }
    @Override
    public void select(){
        System.out.println("查找数据");
    }

}

Run部分:

注意这里为了使用方法,我们类型转换用的是用户接口类而不是他的子类

否则报错:java.lang.ClassCastException:

 public class DynamicAgentDemo {
    public static void main(String[] args) throws  Exception{
        User user = new User();
        Object o = Proxy.newProxyInstance(user.getClass().getClassLoader(),
                user.getClass().getInterfaces(), new MyInvocationHandler(user));
        UserImp u=(UserImp) o;
        u.add();
        u.delete();
        u.select();
        u.update();
    }
}

这是实现动态代理的方法:

public static Object newProxyInstance(ClassLoader loader,类<?>[] interfaces,InvocationHandler h) throws IllegalArgumentException返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序。

最后一个InvocationHandler需要我们自己实现

public class MyInvocationHandler implements InvocationHandler {
    private Object obj;
    public MyInvocationHandler(Object obj) {
        this.obj=obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(obj, args);
        System.out.println("操作日志");
        return result;
    }
}

 运行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值