Java中代理有静态代理动态代理。静态代理的代理关系在编译时就确定了,而动态代理的代理关系是在运行期确定的。静态代理实现简单,适合于代理类较少且确定的情况,而动态代理则给我们提供了更大的灵活性。Java中的方法继承及重写本质上可以看做是一种动态代理,实际上CGLIB动态代理的原理就是继承。

Java中动态代理有JDK原生动态代理CGLIB动态代理两种。前者本质上是根据定好的接口动态生成静态代理类(该接口的实现类);后者则不需要事先定好接口而是可以直接根据类进行动态代理,其本质是根据指定的类动态生成静态代理类(指定的类的子类)。动态代理中,被代理的对象的所有方法都会被代理,除非在代理逻辑中进行方法筛选。

本质

JDK原生动态代理:生成被代理对象所实现的接口的实现类;实现类中每个方法调用被代理对象的相应方法,只不过在调用前后加上了额外逻辑;要求被代理对象实现接口

CGLIB动态代理:生成被代理对象的子类;子类中的每个方法调用被代理对象(父类对象)中的相应方法,只不过在调用前后加上了额外处理;要求被代理对象不能被final修饰

 

动态代理是IOC、AOP等技术的基础。

 

静态代理和JDK动态代理

Dynamic proxies allow one single class with one single method to service multiple method calls to arbitrary classes with an arbitrary number of methods. A dynamic proxy can be thought of as a kind of Facade, but one that can pretend to be an implementation of any interface. Under the cover, it routes all method invocations to a single handler – the invoke() method.   https://www.baeldung.com/java-dynamic-proxies

示例:

Java代理(静态代理、JDK动态代理、CGLIB动态代理)
1 package com.marchon.proxytest;
2 
3 public interface IUserService {
4     public String getUserName();
5     public Integer getAge(String userName);
6 }
IUserService

相关文章: