JDK动态代理笔记整理

简介: JDK动态代理笔记整理

一、动态代理有什么用

1、他能创建对象
2、在原有代码不变不改动的情况下,对原有功能进行增强(有点想装饰者模式)
3、解耦合,让你的业务功能和日志,分离

二、两种实现方式

(1)、JDK动态代理:

通过这三个类 Proxy,method,invocationhandler来实现。
要求目标类必须实现接口

(2)、CGLIB 动态代理

原理是继承
通过创建子类,来重写父类的方法,来达到增强目标类方法。

1、JDK动态代理

开发步骤:
1、创建目标类,SomeServiceImpl 目标类
2、创建InvocationHandler 接口的实现类,在这个类实现给目标方法增强功能
3、使用jdk中类proxy,创建代理对象,实现创建对象的能力

接下来开始代码的演示:

创建目标类接口 SomeService 
package com.mr.lee.service;
public interface SomeService {
    public String doSome();
    public String doOther();
}

创建目标实现类 SomeServiceImpl

package com.mr.lee.service;
public class SomeServiceImpl implements SomeService{
    @Override
    public String doSome() {
        System.out.println("执行了doSome方法");
        return "abc";
    }
    @Override
    public String doOther() {
        System.out.println("执行了doOther方法");
        return "abc";
    }
}
创建MyInvocationHandler类,来实现InvocationHandler接口,
该类的目的就是用来给目标方法增强功能
package com.mr.lee.dao;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
 * 实现InvocationHandler接口,用来给目标方法增强功能
 */
public class MyInvocationHandler implements InvocationHandler {
    //目标对象
    private Object target;
    public MyInvocationHandler(Object target) {
        this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //通过代理对象执行方法时,会执行这个invoke方法
        Object res = null;
        //执行目标类的方法,通过method类实现
        System.out.println("当前执行的方法是:" + method.getName());
        if(method.getName().equals("doSome")){
            System.out.println("当前执行时间:" + System.currentTimeMillis());
            res = method.invoke(target,args);//相当于SomeServiceImpl.doSome()方法
            System.out.println("执行结束时间:" + System.currentTimeMillis());
            return res;
        }
        return method.invoke(target,args);//相当于SomeServiceImpl.doSome()方法
    }
}
测试了跑一下
package com.mr.lee;
import com.mr.lee.dao.MyInvocationHandler;
import com.mr.lee.service.SomeService;
import com.mr.lee.service.SomeServiceImpl;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class AppTest 
{
    @Test
    public void shouldAnswerWithTrue()
    {
        SomeService target = new SomeServiceImpl();
        InvocationHandler handler = new MyInvocationHandler(target);
        //使用Proxy创建代理对象
        SomeService proxy = (SomeService) Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                handler
        );
        //通过代理执行方法,会调用handler中的invoke方法
        proxy.doSome();
        proxy.doOther();
    }
}
执行结果
当前执行的方法是:doSome
当前执行时间:1664091059671
执行了doSome方法
执行结束时间:1664091059671
当前执行的方法是:doOther
执行了doOther方法
Process finished with exit code 0

2、CGLIB 动态代理

(1)APO底层的实现就是动态代理,AOP就是对动态代理进行的一种规范化。
(2)原理是继承来实现:创建子类, 子类就是代理对象,
要求目标类和方法都不可以是f


相关文章
|
3天前
|
监控 Java API
JDK动态代理和CGLIB动态代理
Java动态代理允许在运行时创建代理对象,增强或拦截目标类方法的执行。主要通过两种方式实现:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口,利用`java.lang.reflect.Proxy`类和`InvocationHandler`接口;CGLIB则通过字节码技术生成目标类的子类作为代理,适用于未实现接口的类。两者均用于在方法执行前后添加额外逻辑,如日志记录、权限控制等,广泛应用于AOP框架中。
|
11天前
|
监控 Java API
JDK动态代理和CGLIB动态代理
Java动态代理允许在运行时创建代理对象,增强或拦截目标类的方法调用,无需修改原代码。它有两种主要实现方式:JDK动态代理和CGLIB动态代理。 - **JDK动态代理**:通过`java.lang.reflect.Proxy`类和`InvocationHandler`接口实现,适用于实现了接口的类。它在方法调用前后插入额外逻辑,如日志记录、权限控制等。 - **CGLIB动态代理**:基于字节码技术,为未实现接口的类生成子类作为代理,重写父类方法以添加增强逻辑。适用于没有接口的类,但要求目标类不能是`final`类或方法。
|
1月前
|
Java API 数据安全/隐私保护
探索Java动态代理的奥秘:JDK vs CGLIB
动态代理是一种在 运行时动态生成代理类的技术,无需手动编写代理类代码。它通过拦截目标方法的调用,实现对核心逻辑的 无侵入式增强(如日志、事务、权限控制等)。
53 0
探索Java动态代理的奥秘:JDK vs CGLIB
|
7月前
|
Java
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
这篇文章是Spring5框架的实战教程,深入讲解了AOP的基本概念、如何利用动态代理实现AOP,特别是通过JDK动态代理机制在不修改源代码的情况下为业务逻辑添加新功能,降低代码耦合度,并通过具体代码示例演示了JDK动态代理的实现过程。
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
|
4月前
|
安全 Java 开发者
AOP中的JDK动态代理与CGLIB动态代理:深度解析与实战模拟
【11月更文挑战第21天】面向切面编程(AOP,Aspect-Oriented Programming)是一种编程范式,它通过将横切关注点(cross-cutting concerns)与业务逻辑分离,以提高代码的可维护性和可重用性。在Java开发中,AOP的实现离不开动态代理技术,其中JDK动态代理和CGLIB动态代理是两种常用的方式。本文将从背景、历史、功能点、业务场景、底层逻辑等多个维度,深度解析这两种代理方式的区别,并通过Java示例进行模拟和比较。
204 5
|
5月前
|
Java 关系型数据库 MySQL
自动化测试项目实战笔记(一):JDK、Tomcat、MySQL、Jpress环境安装和搭建
这篇文章是关于自动化测试项目实战笔记,涵盖了JDK、Tomcat、MySQL、Jpress环境的安装和搭建过程,以及测试用例和常见问题总结。
118 1
自动化测试项目实战笔记(一):JDK、Tomcat、MySQL、Jpress环境安装和搭建
|
5月前
|
Java Spring 数据库连接
[Java]代理模式
本文介绍了代理模式及其分类,包括静态代理和动态代理。静态代理分为面向接口和面向继承两种形式,分别通过手动创建代理类实现;动态代理则利用反射技术,在运行时动态创建代理对象,分为JDK动态代理和Cglib动态代理。文中通过具体代码示例详细讲解了各种代理模式的实现方式和应用场景。
92 0
[Java]代理模式
|
5月前
|
Java
【编程进阶知识】静态代理、JDK动态代理及Cglib动态代理各自存在的缺点及代码示例
本文介绍了三种Java代理模式:静态代理、JDK动态代理和Cglib动态代理。静态代理针对特定接口或对象,需手动编码实现;JDK动态代理通过反射机制实现,适用于所有接口;Cglib动态代理则基于字节码技术,无需接口支持,但需引入外部库。每种方法各有优缺点,选择时应根据具体需求考虑。
53 1
|
7月前
|
Java API 开发者
Jdk动态代理为啥不能代理Class?
该文章主要介绍了JDK动态代理的原理以及为何JDK动态代理不能代理Class。
Jdk动态代理为啥不能代理Class?
|
7月前
|
开发者 C# 容器
【独家揭秘】当WPF邂逅DirectX:看这两个技术如何联手打造令人惊艳的高性能图形渲染体验,从环境搭建到代码实践,一步步教你成为图形编程高手
【8月更文挑战第31天】本文通过代码示例详细介绍了如何在WPF应用中集成DirectX以实现高性能图形渲染。首先创建WPF项目并使用SharpDX作为桥梁,然后在XAML中定义承载DirectX内容的容器。接着,通过C#代码初始化DirectX环境,设置渲染逻辑,并在WPF窗口中绘制图形。此方法适用于从简单2D到复杂3D场景的各种图形处理需求,为WPF开发者提供了高性能图形渲染的技术支持和实践指导。
463 0