0
点赞
收藏
分享

微信扫一扫

JDK的动态代理


在学习SpringAOP的时候,知道底层是使用代理机制来实现的。之前一直对代理有点模糊,那现在就来认识一下

Sping的AOP 的底层用到两种代理机制

JDK的动态代理:  针对实现了接口的类产生代理

Cglib的动态代理: 针对没有实现接口的类产生代理,应用的是底层的字节码增强的技术 生成 当前类的子类对象



import java.io.ObjectInputStream.GetField;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;


/**
* @author 文龙
* @version 2018-3-7 下午1:34:16
*/
//JDK的动态代理
public class Demo {

public static void main(String[] args) {
UserDao userDao = new UserDaoImpl();
//这里返回的就是代理对象,代理对象只要调用任意的方法,都会执行一个invoke,调用method.invoke()就进入到实际的对象调用了
UserDao proxy = getProxy(userDao);
proxy.save();
}

public static UserDao getProxy(final UserDao userDao) {
//返回一个代理对象
UserDao u = (UserDao)Proxy.newProxyInstance(userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces(),new InvocationHandler() {
//代理对象调用一次方法,就调用一次invoke
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("方法调用前");
//在这里还可以拿到调用方法的信息,从而执行相应的业务逻辑
System.out.println("调用方法的name是:" + method.getName());
//执行原来的对象方法
method.invoke(userDao, args);
System.out.println("方法调用后");
return null;
}
} );
return u;
}
}
interface UserDao {
void save();
void update();
}

class UserDaoImpl implements UserDao {
public void save() {
System.out.println("执行了save方法");
}
public void update() {
System.out.println("执行了update方法");
}
}



举报

相关推荐

0 条评论