JDK动态代理

本文详细介绍了JDK动态代理技术,通过示例展示了如何创建基于接口的动态代理对象,实现了方法的前置和后置增强。核心在于使用`Proxy.newProxyInstance()`方法,结合`InvocationHandler`接口实现增强逻辑。在实际应用中,动态代理常用于AOP(面向切面编程)场景,如日志记录、权限校验等。
摘要由CSDN通过智能技术生成
AOP的动态代理技术
  • JDK动态代理技术

    • 基于接口的动态代理技术
      • 动态代理图示
        JDK动态代理图

      • JDK动态代理技术原理

        // TargetInterface类
        // 动态代理的目标接口
        public interface TargetInterface {
            public void save();
        }
        
        ===================================================
        
        // Target类
        	public class Target implements TargetInterface{
        	    @Override
        	    public void save() {
        	        System.out.println("svae....");
        	    }
        	}	
        ==================================================
        
        // Advice增强类
        public class Advice {
            // Advice 表示增加类
            // 前置增强
            public void before(){
                System.out.println("before");
            }
            // 后置增强
            public void afterRunning(){
                System.out.println("after");
            }
        }
        ==================================================
        // 重点实现类
        /* 在此类中要注意事项
        	1.使用Proxy.newProxyInstance来创建代理对象,并且使用目标对象的接口来接收
        	2.在构造中的三个参数
        	3.第三个匿名对象的参数
        */ 
        public void test(){
                // 要有目标对象
                Target target = new Target();
                // 创建增强的类
                Advice advice = new Advice();
                // 使用JDK的动态代理(使用接口来接收)
                TargetInterface proxy = (TargetInterface) Proxy.newProxyInstance(
                        target.getClass().getClassLoader(),// 第一个参数为:目标对象的类选择器
                        target.getClass().getInterfaces(),// 第二个参数为:目标对象相同的接口字节码数组
                        // 第三个参数为:InvocationHandler匿名对象
                        new InvocationHandler() {
                            @Override
                            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                                // 这个匿名对象的三个参数为
                                // proxy:被代理对象
                                // method:要执行的方法
                                // args:要传入的参数
                                // 前置增强(要想有增强的方法,要有增强的类)
                                advice.before();
                                Object invoke = method.invoke(target, args);
                                advice.afterRunning();
                                return invoke;
                            }
                        }
                );
                // 调用一下代理对象
                proxy.save();
        
        }
        

``

注意事项:配置xml配置文件或者注解方式来使用!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值