动态代理

基于JDK反射机制提供的代理

JDK动态代理底层就是在内存中创建一个代理类,实现了被代理类的接口并重写了方法,每个方法都调用了InvocationHandler实现类的invoke方法。对被代理类的方法进行增强,从而减少了冗余的代码。

 

模拟账户转账

账户实体类

public class Account {
    String username;
    String passworld;
    double money;

    public Account() {
    }

    public Account(String username, String passworld, double money) {
        this.username = username;
        this.passworld = passworld;
        this.money = money;
    }

    //  省略get、set
}

账户Service接口

public interface AccountService {
    void save(Account account);
    void transfer(Account from, Account to);
}

账户Service接口实现

public class AccountServiceImpl implements AccountService {
    @Override
    public void save(Account account) {
        System.out.println("账户保存成功!");
    }

    @Override
    public void transfer(Account from, Account to) {
        System.out.println("转账成功!");
    }
}

定义代理工具类

public class ProxyUtil {

    //obj 传入被代理实例对象,对被代理对象的所有方法进行增强,然后返回代理对象
    public static <T> T getProxyInstance(Object obj){
        //java.lang.reflect.Proxy:这是 Java 动态代理机制的主类,它提供了一个静态方法来为一组接口的实现类动态地生成代理类及其对象
        return (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(), //得到类加载器
                obj.getClass().getInterfaces(), //被代理对象实现的所有接口
                new InvocationHandler() { //InvocationHandler实现类
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                        //增强代码
                        System.out.println("======before=======");

                        //反射:调用被代理实例对象的method
                        Object result = method.invoke(obj, args);

                        //增强代码
                        System.out.println("======after=======");
                        return result;
                    }
                });
    }
}

测试

public class Test {

    public static void main(String[] args) {
        Account account = new Account("张三","123",1000);

        AccountService accountService = ProxyUtil.getProxyInstance(new AccountServiceImpl());

        accountService.save(account);
    }
}

执行结果:

======before=======
账户保存成功!
======after=======
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值