动态代理三种实现方式
- 静态代理
- 动态代理
- jdk动态代理
- cglib动态代理 jar包
静态代理
某个对象提供⼀个代理,代理⻆⾊固定,以控制对这个对象的访问。 代理类和委托类有共同的⽗类或
⽗接⼝,这样在任何使⽤委托类对象的地⽅都可以⽤代理对象替代。代理类负责请求的预处理、过滤、
将请求分派给委托类处理、以及委托类执⾏完请求后的后续处理。
调用代理的方法{
方法前加强。
对象实现的方法。
方法后加强。
}
案例:
行为接口:结婚
顾客:Lff
代理:增强Lff结婚
//行为接口
public interface Marry {
public void toMarry();
}
//顾客
public class Lff implements Marry{
@Override
public void toMarry(){
System.out.println("罗飞飞结婚了");
}
}
//代理
public class StaticProxy implements Marry{
private Marry marry;//结婚需求的对象
public StaticProxy(Marry marry){
this.marry=marry;
}
@Override
public void toMarry(){
System.out.println("找到了婚庆公司,准备好了婚礼。");
marry.toMarry();
System.out.println("洞房花烛夜。。。。。");
}
}
动态代理
相比于静态代理,动态代理在创建代理对象上更加的灵活,动态代理类的字节码在程序运行时,由Java反射机制动态产生。它会根据需要,通过反射机制在程序运行期,动态的为目标对象创建代理对象,无需程序员手动编写它的源代码。动态代理不仅简化了编程工作,而且提高了软件系统的可扩展性,因为反射机制可以生成任意类型的动态代理类。代理的行为可以代理多个方法,即满足生产需要的同时又达到代码通用的目的。
特点:
- 目标对象不固定
- 在应用程序执行时动态创建目标对象
- 代理对象会增强目标对象的行为
jdk 代理 动态实现接口代理商
//行为接口
public interface Marry {
public void toMarry();
}
//顾客
public class Lff implements Marry{
@Override
public void toMarry(){
System.out.println("罗飞飞结婚了");
}
}
//代理
public class LffProxy {
public static Object getProxyBean(Object obj){
Class clazz = obj.getClass();
return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), new InvocationHandler() {
//生成的代理对象的方法
/**
*
* @param proxy 代理对象
* @param method 目标类的行为方法
* @param args 目标类行为方法的参数
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("找到了婚庆公司,准备好了婚礼。");
//目标类 Lff的行为方法执行
Object invoke = method.invoke(obj, args);
System.out.println("洞房花烛夜。。。。。");
return invoke;
}
});
}
}
cglib动态代理 动态实现子类代理商
导入包
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-full</artifactId>
<version>2.0.2</version>
</dependency>
//顾客
public class Lff{
public void toMarry(){
System.out.println("罗飞飞结婚了");
}
}
//代理
public class LffProxy {
public static Object getProxyBean(Object obj){
//代理对象的模板
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(obj.getClass());
enhancer.setCallback(new MethodInterceptor() {
/**
*
* @param o 代理对象
* @param method 目标行为方法
* @param objects 目标行为方法参数
* @param methodProxy 目标行为方法的代理对象
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("找到了婚庆公司,准备好了婚礼。");
Object invoke = method.invoke(obj, objects);
System.out.println("洞房花烛夜。。。。。");
return invoke;
}
});
//生成代理对象
return enhancer.create();
}
}
本文介绍了Java中动态代理的三种实现方式:静态代理、JDK动态代理和CGLIB动态代理。静态代理通过继承或实现相同接口创建代理类,而动态代理则在运行时动态生成字节码实现代理。JDK动态代理基于接口,CGLIB动态代理则通过子类化目标对象来实现。通过动态代理,可以在不修改目标对象代码的情况下增强其行为。
1886

被折叠的 条评论
为什么被折叠?



