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
谢谢!