动态代理是指,程序在整个运行过程中根本就不存在目标类的代理类,目标对象的代理对象只是由代理生成工具(如代理工厂类)
在程序运行时由 JVM 根据反射等机制动态生成的。代理对象与目标对象的代理关系在程序运行时才确立。
下面直接给出案例
业务接口
package com.demo;
public interface IAccountService {
public void transfer(); //主业务逻辑:转账
}
目标类
package com.demo;
public class AccountServiceImpl implements IAccountService {
public void transfer() { //目标方法
System.out.println("调用Dao层,完成转账主业务");
}
}
业务增强代码
package com.demo;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyExtension implements InvocationHandler{
private Object target;
public MyExtension() {
}
public MyExtension(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("对转账进行身份验证");//增强主业务逻辑代码
return method.invoke(target, args);
}
}
测试代码
package com.demo;
import java.lang.reflect.Proxy;
public class Client {
public static void main(String[] args) {
IAccountService target = new AccountServiceImpl();
IAccountService proxy = (IAccountService) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new MyExtension());
proxy.transfer();
}
}