基于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=======