首页 > 其他分享 >JVM技术 反射与动态代理

JVM技术 反射与动态代理

时间:2023-04-20 13:08:28浏览次数:44  
标签:反射 return 代理 public JVM throwable catch new Class


评:
动态代理

Sun对动态代理的说明:

一个简单例子代码:

动态代理的内部实现——代码生成:

研究JDK源代码,发现在Proxy的sun实现中调用了sun.misc.ProxyGenerator类的generateProxyClass( proxyName, interfaces)方法,其返回值为byte[]和class文件的内存类型一致。于是做如下试验:

public class ProxyClassFile{ 

 public static void main(String[] args){ 

 String proxyName = "TempProxy"; 

 TempImpl t = new TempImpl("proxy"); 

 Class[] interfaces =t.getClass().getInterfaces(); 

 byte[] proxyClassFile = ProxyGenerator.generateProxyClass( 

 proxyName, interfaces); 

 File f = new File("classes/TempProxy.class"); 

 try { 

 FileOutputStream fos = new FileOutputStream(f); 

 fos.write(proxyClassFile); 

 fos.flush(); 

 fos.close(); 

 } catch (FileNotFoundException e) { 

 e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 

 } catch (IOException e) { 

 e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 

 } 

 } 

 }



运行该类,到class文件夹下,利用反编译技术,发现原来其采用了代码生产技术:

public interface Temp{ 

 public void Talk(); 

 public void Run(); 

 } 

 import java.lang.reflect.*; 

 public final class TempProxy extends Proxy 

 implements Temp{ 

 private static Method m4; 

 private static Method m2; 

 private static Method m0; 

 private static Method m3; 

 private static Method m1; 

 public TempProxy(InvocationHandler invocationhandler) { 

 super(invocationhandler); 

 } 

 public final void Run() { 

 try { 

 h.invoke(this, m4, null); 

 return; 

 } 

 catch(Error _ex) { } 

 catch(Throwable throwable) { 

 throw new UndeclaredThrowableException(throwable); 

 } 

 } 

 public final String toString(){ 

 try{ 

 return (String)h.invoke(this, m2, null); 

 } 

 catch(Error _ex) { } 

 catch(Throwable throwable) { 

 throw new UndeclaredThrowableException(throwable); 

 } 

 return ""; 

 } 

 public final int hashCode() { 

 try { 

 return ((Integer)h.invoke(this, m0, null)).intValue(); 

 } 

 catch(Error _ex) { } 

 catch(Throwable throwable){ 

 throw new UndeclaredThrowableException(throwable); 

 } 

 return 123; 

 } 

 public final void Talk(){ 

 try{ 

 h.invoke(this, m3, null); 

 return; 

 } 

 catch(Error _ex) { } 

 catch(Throwable throwable) { 

 throw new UndeclaredThrowableException(throwable); 

 } 

 } 

 public final boolean equals(Object obj) { 

 try { 

 return ((Boolean)h.invoke(this, m1, new Object[] { 

 obj 

 })).booleanValue(); 

 } 

 catch(Error _ex) { } 

 catch(Throwable throwable) { 

 throw new UndeclaredThrowableException(throwable); 

 } 

 return false; 

 } 

 static{ 

 try{ 

 m4 = Class.forName("Temp").getMethod("Run", new Class[0]); 

 m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]); 

 m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]); 

 m3 = Class.forName("Temp").getMethod("Talk", new Class[0]); 

 m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] { 

 Class.forName("java.lang.Object") 

 }); 

 } 

 catch(NoSuchMethodException nosuchmethodexception) { 

 throw new NoSuchMethodError(nosuchmethodexception.getMessage()); 

 } 

 catch(ClassNotFoundException classnotfoundexception) { 

 throw new NoClassDefFoundError(classnotfoundexception.getMessage()); 

 } 

 } 

 }

标签:反射,return,代理,public,JVM,throwable,catch,new,Class
From: https://blog.51cto.com/u_16080829/6209463

相关文章

  • ASEMI代理ADM202EARNZ-REEL原装ADI车规级ADM202EARNZ-REEL
    编辑:llASEMI代理ADM202EARNZ-REEL原装ADI车规级ADM202EARNZ-REEL型号:ADM202EARNZ-REEL品牌:ADI/亚德诺封装:SOIC-16批号:2023+引脚数量:16安装类型:表面贴装型ADM202EARNZ-REEL汽车芯片ADM202EARNZ-REEL特征特征符合89/336/EECEMC指令符合IEC1000-4-2(801.2)的ESD保护±8k......
  • Java 8 中使用反射进行命令执行的 5 个方法
    今天在逛先知的时候看到了一篇文章:《探究使用反射进行除Runtime的命令执行方法》https://xz.aliyun.com/t/12446其中大概讲了下命令执行的其他构造方式,但最后没有给出实例,所以我这里就简单研究了一下。概述在RASP等安全产品防护严密的现在,普通的寻找Runtime.getRuntime().exec(......
  • 一次线上JVM调优实践的优化过程
    通过这一个多月的努力,将FullGC从40次/天优化到近10天才触发一次,而且YoungGC的时间也减少了一半以上,这么大的优化,有必要记录一下中间的调优过程。对于JVM垃圾回收,之前一直都是处于理论阶段,就知道新生代,老年代的晋升关系,这些知识仅够应付面试使用的。前一段时间,线上服务器的FullGC......
  • ASEMI代理ADG736BRMZ-REEL7原装ADI车规级ADG736BRMZ-REEL7
    编辑:llASEMI代理ADG736BRMZ-REEL7原装ADI车规级ADG736BRMZ-REEL7型号:ADG736BRMZ-REEL7品牌:ADI/亚德诺封装:MSOP-10批号:2023+安装类型:表面贴装型引脚数量:10类型:车规级芯片ADG736BRMZ-REEL7特征1.8V至5.5V单电源汽车温度范围:−40°C至+125°C2.5Ω(典型)导通电阻低导通......
  • Win10总是自动打开网络代理服务器
    转自:https://office.tqzw.net.cn/computer/windows/28554.htmlwindows10总是隔几分钟就自动开启代理,然后就无法打开网页。还有时候代理服务器开关没有自动打开,但是就是莫名其妙就无法上网上,打开只要代理服务器设置的页面,然后就又可以上网了。这问题困扰了很久了,网上找了很多办法,......
  • 一天吃透JVM面试八股文
    什么是JVM?JVM,全称JavaVirtualMachine(Java虚拟机),是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相关的信息,使得Java程序只需要生成在Java虚拟机上运行的目标......
  • Vue脚手架配置代理
    Vue-cli配置代理在前后端直接配置一个代理服务器,这个代理服务器和前端处于一个位置,当前端向后端请求数据的时候,不会直接访问后端,而是找这台代理,代理收到前端的请求,转发给后端,如果收到后端的响应数据,就把这些数据返回给前端。方法一在vue.config.js中添加如下配置:devServer:{......
  • Java JVM、JNI、Native Function Interface、Create New Process Native Function API
    JavaJVM、JNI、NativeFunctionInterface、CreateNewProcessNativeFunctionAPIAnalysis目录1.JAVAJVM2.JavaJNI:JavaNativeInterface3.JavaCreateNewProcessNativeFunctionAPIAnalysisInLinux4.JavaCreateNewProcessNativ......
  • javasec(一)java反射
    这篇文章介绍javasec基础知识--java反射。0x01反射是什么?反射是一种机制,利用反射机制动态的实例化对象、读写属性、调用方法、构造函数。在程序运行状态中,对于任意一个类或对象,都能够获取到这个类的所有属性和方法(包括私有属性和方法),这种动态获取信息以及动态调用对象方法的......
  • GE反射内存实时通讯网络解决方案
    时通讯网络是用于需要较高实时性要求的应用领域的专用网络通讯技术,一般采用基于高速网络的共享存储器技术实现。它除了具有严格的传输确定性和可预测性外,还具有速度高、通信协议简单、宿主机负载轻、软硬件平台适应性强、可靠的传输纠错能力、支持中断信号的传输等特点。本方案选......