JDK动态代理是通过JDK中的 java.lang.reflect.Proxy 类来实现的。
举例:
1.有如下接口和实现类:
接口:
public interface UserDao {
public void save();
public void update();
public void delete();
public void find();
}
实现类:
public class UserDaoImpl implements UserDao {
public void save() {
System.out.println("save 添加用户");
}
public void update() {
System.out.println("update 修改用户");
}
public void delete() {
System.out.println("delete 删除用户");
}
public void find() {
System.out.println("find 查询用户");
}
}
2.创建切面类MyAspect
public class MyAspect {
public void myBefore(){
System.out.println("方法执行前");
}
public void myAfter(){
System.out.println("方法执行后");
}
}
3.创建MyBeanFactory类,在该类中通过Proxy实现动态代理
public class MyBeanFactory {
public static UserDao getBean(){
// 1.准备目标类
final UserDao userDao = new UserDaoImpl(); // 在spring中通过注入获取单例对象
//2.创建切面类
final MyAspect myAspect = new MyAspect();
//3.使用代理类,进行增强
return (UserDao)Proxy.newProxyInstance(MyBeanFactory.class.getClassLoader(),new Class[]{UserDao.class},new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException {
//增强前
myAspect.myBefore();
Object obj = method.invoke(userDao,args);
//增强后
myAspect.myAfter();
return obj;
}
});
}
这里模拟了Spring框架Ioc思想
代理类主要是对创建的实例中的方法进行增强
4.测试
@Test
public void demo3(){
UserDao userDao = MyBeanFactory.getBean();
userDao.save();
userDao.delete();
userDao.find();
userDao.update();
}
测试结果:

5.总结:JDK动态代理模式可以减少系统间的重复代码,达到模块间的松耦合目的,让方法只关注于业务本身。