JDK动态代理在1.3的时候引入,其底层需要依赖一个工具类java.lang.reflect.Proxy和一个接口java.lang.reflect.InvocationHandler
JDK 动态代理 必须基于 接口进行代理
代码示例:
JdkProxyUtils.java
package com.my.jdkproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//对目标对象 创建 JDK 动态代理 (工具类)
public class JdkProxyUtils implements InvocationHandler {
// 代理目标对象
private Object target;
public JdkProxyUtils(Object target) {
this.target = target;
}
//通过invoke调用 目标对象 方法
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("执行JDK代理增强!!!!!!");
return method.invoke(target, args); // 调用目标对象方法
}
// 为目标对象创建代理
public Object createProxy(){
// loader 目标对象类加载器
// interfaces 目标对象实现接口
// h 回调对象,需要invocationhandler 执行目标对象方法
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
}
UserDao.java
package com.my.jdkproxy;
//用户操作接口
public interface UserDao {
public void save();
public void update();
public void delete();
}
UserDaoImpl.java
package com.my.jdkproxy;
//用户操作实现类
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("保存用户。。。");
}
@Override
public void update() {
System.out.println("更新用户。。。");
}
@Override
public void delete() {
System.out.println("删除用户。。。");
}
}
Test.java
package com.my.jdkproxy;
public class Test {
// 没有代理编程
@org.junit.Test
public void demo1(){
System.out.println("没有代理编程");
// 业务对象
UserDao userDao = new UserDaoImpl();
userDao.save();
userDao.update();
userDao.delete();
System.out.println("----------------");
}
// 应用JDK动态代理
@org.junit.Test
public void demo2(){
System.out.println();
System.out.println("应用JDK动态代理");
// 目标对象
UserDao userDao = new UserDaoImpl();
// 为目标对象 创建JDK动态代理
JdkProxyUtils jdkProxyUtils = new JdkProxyUtils(userDao);// 传入目标对象
UserDao proxy = (UserDao) jdkProxyUtils.createProxy(); // 必须根据接口创建代理
// 调用代理对象方法
proxy.save(); // 执行 InvocationHandler 的 invoke方法
proxy.update();
proxy.delete();
}
}
运行结果:
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/12098.html