AOP底层使用动态代理
有两种情况动态代理
第一种有接口情况,使用JDK动态代理
第二种无接口情况,使用CGKIB动态代理
这里来演示第一种情况
1我们先定义一个接口
public interface UserDao {
public int add(int a,int b);
public String update(String s);
}
2定义接口的实现类
public class UserDaoIm implements UserDao{
@Override
public int add(int a,int b) {
// TODO Auto-generated method stub
return a+b;
}
@Override
public String update(String s) {
// TODO Auto-generated method stub
return s;
}
}
3现在我们要对该实现类中的add方法的功能进性加强具体的解释可以看代码中的注释
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDK {
public static void main(String[] args) {
Class[] interfaces= {UserDao.class};
//创建接口代理类的实例
//该方法有三个参数
//loader 用哪个类加载器来对生成的代理对象进行加载,代理对象并不是我们要调用的那个真实的对象
//而是代理真实对象的那个代理对象
// interfaces 动态代理类需要实现的接口
//InvocationHandler 动态代理方没法在执行的时候会调用h里面的invoke方法
UserDao proxy=(UserDao)Proxy.newProxyInstance(JDK.class.getClassLoader(), interfaces, new Hand(new UserDaoIm()));
int re=proxy.add(1, 2);
System.out.println(re);
}
}
//每个动态代理类都必须实现InvocationHandler接口,并且每个代理类的实例都关联到了一个Handler,
//当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler接口的invoke方法
//来进行调用
class Hand implements InvocationHandler{
//我要代理谁,就将谁传过来
private Object obj;
public Hand(Object obj) {
this.obj=obj;
}
@Override
//proxy指我们所代理的那个真实对象
//method指代的是我们所调用的真实对象的某个方法的method对象
//args指代的是调用真实对象的某个方法时接受的参数
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
System.out.println("add方法执行之前");
Object re=method.invoke(obj, args);
System.out.println("add方法执行之后");
return re;
}
}