动态代理

Posted bowenqianngzhibushiwo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态代理相关的知识,希望对你有一定的参考价值。

动态代理包括jdk动态代理和CGLIB动态代理

其中jdk动态代理是通过对象本身实现接口,而代理对象不实现接口来实现

在Spring中实现AOP即面向切面的编程的时候,需要用到动态代理,

当代理的类是基于接口实现的时候Spring会使用jdk动态代理,但是当时基于继承实现代理的时候Spring自动切换为CGLIB动态代理。

 

java代理机制中最重要的是一个InvocationHandler接口和Proxy类,这两个是实现动态代理不可或缺的。

invocationHandler 中有一个唯一的方法invoke()

Object invoke(Object proxy,,Method method,Object[] args ) thros throwable

proxy:所被代理的真实对象

method:所要调用的真实对象的某个方法的Method

args: 调用真实对象的某个方法时接收的参数

 

proxy类中的中最常用的方法就是 newproxyinstance()方法

public static Obejct newProxyInstance(ClassLoader losder,Class<?>[] interface,InvocatinHandler h)throws illega;ArgumentException{};

 

loader :一个classloader对象定义了由哪个classloader对象来对生成的代理对象进行加载

interfaces:一个interface对象的数组,是给需要被代理的对象提供的一组接口,这个代理对象就宣称可以实现这些接口实现多态

h: 一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上

 

代码实现


//interface
public interface A{
public void a();
public void aa(String str);

}
//realsubbject

public class Realsubbject implements A{
@Overrider
public void a(){}
@Override
public void aa(String str){}


}
//proxy代理类
public class jdkproxy implements invocationhandler {

//subjext
private Object subObject;

public jdkprocy(Object subObject){this.subObject=subObject;}
@Overrider
public Object invokeObject proxy,Mehtod method,Onject<?>[] args)thorows throwable{
//before
...
method.invoke(subject,args);//代理调用方法的使用总是会自动跳转到 
                           //相关的handler对象的invoke方法。
//after
...

return null;

}

}
//实现类

public class Imp{

A subObject=new Realsubject();

InvacotionHandler  handler=new jdkobject(sunObject);//把需要代
                                //理的对象,通过该对象来调用方法

A subObject=(A)Proxy.newProxyInstance(h.getclass().getclassloader(),realObject.getclass().getinterface(),h);
System.out.println(subObject.getClass().getName());


}

 

reference:https://blog.csdn.net/weixin_34362991/article/details/85589143

以上是关于动态代理的主要内容,如果未能解决你的问题,请参考以下文章

动态 Rstudio 代码片段

是否可以动态编译和执行 C# 代码片段?

支持动态或静态片段的不同屏幕尺寸?

Forge Viewer - 如何在场景中访问(或获取渲染/片段代理)克隆的网格?

在ansible模板中使用动态组名称

代理模式(动态)