当前位置: 首页 > news >正文

wordpress网站跳转爱南宁app下载官网

wordpress网站跳转,爱南宁app下载官网,响应式网站建设模板,网站建设华为转载自 jdk和cglib简单理解之前使用cglib的时候不需要将classLoader作为参数传入#xff0c;但动态代理却要#xff0c;带着这个疑惑进入这个方法#xff1a;Proxy.newProxyInstance(classLoader, interfaces, InvocationHandler)要在classLoader里去找interfaces#xff0…转载自 jdk和cglib简单理解之前使用cglib的时候不需要将classLoader作为参数传入但动态代理却要带着这个疑惑进入这个方法Proxy.newProxyInstance(classLoader, interfaces, InvocationHandler)要在classLoader里去找interfaces如果也加载进来了才能继续执行并且用ProxyGenerator动态生成了一个代理类的字节码文件使用了缓存技术只需要生成一次然后用classLoader将这个字节码文件加载进来。这就是classLoader的作用。可以这样看生成的字节码类。加入执行参数System.setProperty(sun.misc.ProxyGenerator.saveGeneratedFiles, true) 生成的字节码文件就会保留下来然后编译出来如下 package demo;import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.lang.reflect.UndeclaredThrowableException;public final class $Proxy0 extends Proxy implements IA {private static Method m1;private static Method m4;private static Method m3;private static Method m0;private static Method m2;public $Proxy0(InvocationHandler paramInvocationHandler) {super(paramInvocationHandler);}public final boolean equals(Object paramObject) {try {return ((Boolean) this.h.invoke(this, m1, new Object[] { paramObject })).booleanValue();} catch (RuntimeException localRuntimeException) {throw localRuntimeException;} catch (Throwable localThrowable) {throw new UndeclaredThrowableException(localThrowable);}}public final int b(String paramString) {try {return ((Integer) this.h.invoke(this, m4,new Object[] { paramString })).intValue();} catch (RuntimeException localRuntimeException) {throw localRuntimeException;} catch (Throwable localThrowable) {throw new UndeclaredThrowableException(localThrowable);}}public final void a() {try {this.h.invoke(this, m3, null);return;} catch (RuntimeException localRuntimeException) {throw localRuntimeException;} catch (Throwable localThrowable) {throw new UndeclaredThrowableException(localThrowable);}}public final int hashCode() {try {return ((Integer) this.h.invoke(this, m0, null)).intValue();} catch (RuntimeException localRuntimeException) {throw localRuntimeException;} catch (Throwable localThrowable) {throw new UndeclaredThrowableException(localThrowable);}}public final String toString() {try {return (String) this.h.invoke(this, m2, null);} catch (RuntimeException localRuntimeException) {throw localRuntimeException;} catch (Throwable localThrowable) {throw new UndeclaredThrowableException(localThrowable);}}static {try {m1 Class.forName(java.lang.Object).getMethod(equals,new Class[] { Class.forName(java.lang.Object) });m4 Class.forName(demo.IA).getMethod(b, new Class[] { Class.forName(java.lang.String) });m3 Class.forName(demo.IA).getMethod(a, new Class[0]);m0 Class.forName(java.lang.Object).getMethod(hashCode, new Class[0]);m2 Class.forName(java.lang.Object).getMethod(toString, new Class[0]);} catch (NoSuchMethodException localNoSuchMethodException) {throw new NoSuchMethodError(localNoSuchMethodException.getMessage());} catch (ClassNotFoundException localClassNotFoundException) {throw new NoClassDefFoundError(localClassNotFoundException.getMessage());}} } 可以发现所有接口方法的实现都委托给InvocationHandler的invoke方法了这也就是实现代理模式的地方了。-------------------------------------------------------------------------- cglib不需要传入ClassLoader,代码里会自己去找上下文的ClassLoader,这种设计使少传一个ClassLoader这种很少见的参数对初学者来说用起来要简单点。 可以设置System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, 字节码文件保存位置把cglib生成的动态字节码保存下来。 单间分析下生成的字节码 动态生成的继承类会改写我们使用的父类的所有方法拦截下来交给设置的MethodInterceptor去执行。public Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) 第一个参数obj就是动态生成的子类。第二个参数是原始类的方法。我们一般使用proxy.invokeSuper(obj,args)方法。这个很好理解就是执行原始类的方法。还有一个方法proxy.invoke(obj,args)这是执行生成子类的方法。如果传入的obj就是子类的话会发生内存溢出因为子类的方法不挺地进入intercept方法而这个方法又去调用子类的方法两个方法直接循环调用了。我们来看看MethodProxy原始类里每一个方法都会在动态的子类里有一个对应的MethodProxy而一个MethodProxy又对应了两个动态生成的FastClass类一个是对应原始方法一个对应新生成的子类MethodProxy.invokeSuper就是交给对应原始方法那个FastClassMethodProxy.invoke交给另一个。这2个额外生成的类作用在于当我们调用一个方法时不通过反射来调用而是通过类似于数组下标的方式来定位方法直接进行类方法的执行。FastClass生成的代码类似这样的 public Object invoke(int paramInt, Object paramObject, Object[] paramArrayOfObject)throws InvocationTargetException{// Byte code:0: aload_2 1: checkcast 159 net/sf/cglib/mytest/A$$EnhancerByCGLIB$$f84d7df4: iload_1 //paramInt参数入栈5: tableswitch default:403 - 408, 0:131-136..... //通过paramInt也就相当于数组小标志定位到方法执行的代码段 ..... .....148: aload_3149: iconst_0150: aaload151: invokevirtual 166 net/sf/cglib/mytest/A$$EnhancerByCGLIB$$f84d7df:equals (Ljava/lang/Object;)Z //直接快速的执行方法 ..... .....} }
http://www.zqtcl.cn/news/183269/

相关文章:

  • 服务器搭建网站打不开网站建设信息平台
  • 宽屏蓝色企业网站源码如何编辑网站标题
  • 免费搭建手机网站广告公司怎么取名
  • 网站抓取超时错误c 高性能网站开发
  • 营销导向企业网站策划wordpress 不显示菜单
  • 特效视频网站用.net做视频网站的案例
  • 网站建设实用的网站视屏网站的审核是怎么做的
  • 网站模板之家免费下载福州网红餐厅
  • 西安网站设计与建设第三方检测机构
  • 手机网站推广法建设网站明细报价表
  • 一级a做爰片免费网站录像好商网的网站可以做中英文切换吗
  • 视频网站闪图怎么做网件路由器管理地址
  • 一个完整的网站建设网站模板去哪要
  • 烤漆 东莞网站建设水果香精东莞网站建设技术支持
  • 国家重大项目建设库网站北京网站开发外包公司
  • 建设免费网站制作二维码的软件app
  • 网站突然没收录了网站建设和运营的成本是多少钱
  • 家政公司网站模板wordpress防cc代码
  • 福田附近做网站公司网站反向链接
  • 南阳网站关键词哪做网站便宜
  • 往网站上做新东西需要什么智库网站建设
  • 网站建站系统程序做网站代理商好赚吗
  • 哪些网站是做食品dedecms转wordpress
  • 广东华迪工程建设监理公司网站网站的优化从哪里进行
  • 国产做的视频网站优秀网站首页
  • 做国际黄金看什么网站网络营销品牌推广公司
  • 手机自助建站平台手机网站开发设计报价单
  • 网站建设标书范本注册了一个域名怎么做网站
  • 行政部建设公司网站东莞市做网站
  • 网站建设开发的流程建设官方网站的主要作用