spring的AOP(二)—-JDK动态代理详解编程语言

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

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论