Java简单动态代理

JAVA初步动态代理
学习了反射,就来顺便说一下接触到的动态代理

实现目的:假设一个银行的核心业务是取钱和存钱,现在核心代码已经写好,不想再改动
现在想要在核心代码运行之前加上身份验证,验证成功后,再执行核心代码取钱和存钱,在核心代码运行完成后,在执行退卡操作。

代码:
要动态代理,需要写一个顶层接口

package com.jingfei.csdn;

public interface Bank {
    public void getMoney();
    public void storeMoney();
}

具体实现类实现该顶层接口

package com.jingfei.csdn;

public class BankImpl implements Bank {
    @Override
    public void getMoney() {
        System.out.println("核心代码---取钱");
    }

    @Override
    public void storeMoney() {
        System.out.println("核心代码---存钱");
    }
}

代理,用到Proxy类,(注意这里返回值类型必须为顶层接口,不能是具体实现的子类,如果是子类会报一下错误Exception in thread “main” java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to com.jingfei.csdn.BankImpl)

package com.jingfei.csdn;

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

public class MyProxy {
    private MyProxy() {
    }
    public static Bank getProxy(BankImpl bank){
        Object o = Proxy.newProxyInstance(bank.getClass().getClassLoader(), bank.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("代理部分---验证身份");//写代理的前奏部分
                Object invoke = method.invoke(bank);//核心代码部分
                System.out.println("代理部分---退卡");//写代理的后奏的部分
                return invoke;
            }
        });
        return (Bank) o;
    }
}

测试类,调用

package com.jingfei.csdn;

import java.lang.reflect.Proxy;

public class demo {
    public static void main(String[] args) {
        //动态代理
        BankImpl bank = new BankImpl();
        Bank proxy = MyProxy.getProxy(bank);
        proxy.getMoney();
        System.out.println("-----------------------");
        proxy.storeMoney();


    }
}

结果:

代理部分---验证身份
核心代码---取钱
代理部分---退卡
-----------------------
代理部分---验证身份
核心代码---存钱
代理部分---退卡

Process finished with exit code 0

谢谢!

猜你喜欢

转载自blog.csdn.net/qq_43371004/article/details/88359808