Java标准库提供了一种动态代理(Dynamic Proxy)的机制:可以在运行期动态创建某个interface
的实例。SpringAOP的实现机制就是依靠动态代理机制实现。动态代理实际上是JVM在运行期动态创建class字节码并加载的过程,而不需要改动源代码
步骤一:创建接口
相关的类
public class User {
public String name;
public int age;
public User(String name,int age){
this. name=name;
this.age=age;
}
public User(){}
}
public interface IUser {
/**
* 打印用户信息
* @param user
*/
void print(User user);
/**
* 打印数字信息
* @param num
*/
void print(int num);
}
步骤二:实现接口
public class IUserImpl implements IUser {
@Override
public void print(User user) {
System.out.println(user.name+"\n"+user.age);
}
@Override
public void print(int num) {
System.out.println(num);
}
}
步骤三:动态增强IUserImpl中的print(User user)方法
public class DynamiProxy {
public static void main(String[] args) {
Class[] objects=new Class[]{IUser.class};
IUserImpl impl=new IUserImpl();
/**
* 生成动态代理类
*/
IUser proxy=(IUser) Proxy.newProxyInstance(IUser.class.getClassLoader(),objects,new MyInnocationHandler(impl));
User user=new User("lily",19);
proxy.print(user);
int num=19;
proxy.print(num);
}
}
/**
* 动态代理增强的处理逻辑
*/
class MyInnocationHandler implements InvocationHandler {
Object object;
//构造函数传入需要被代理的类
public MyInnocationHandler(Object object){
this.object=object;
}
//传入代理对象
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//是否要执行增强逻辑,默认为false,默认不需要增强原方法
boolean flag=false;
//获得方法名
String name = method.getName();
//参数列表
Parameter[] parameters = method.getParameters();
//参数个数
int count=method.getParameterCount();
if("print".equals(name)&&count==1){
for(Parameter parameter:parameters){
if(parameter.getParameterizedType().getTypeName().equals("designPattern.User")){
flag=true;
}
}
}
if(flag){
//执行前逻辑
System.out.println("打印用户的方法执行前");
Object invoke = method.invoke(object, args);
//执行后逻辑
System.out.println("打印用户的方法执行后");
return invoke;
}else{
Object invoke = method.invoke(object, args);
return invoke;
}
}
}
根据代码分析,当执行方法名称为print,且满足参数个数为一,参数类型匹配
designPattern.User【需要考虑实际项目的参数类型,当前仅供参考】时
将会执行增强方法,在原方法的前后执行相应的逻辑