知识大全 JVM技术,反射与动态代理

Posted 虚拟机

篇首语:幽沉谢世事,俯默窥唐虞。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 JVM技术,反射与动态代理相关的知识,希望对你有一定的参考价值。

JVM技术,反射与动态代理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  Java程序的工作机制 Java对象都以单独的class文件存在 java虚拟机将其载入并执行其虚拟机指令

    

  Java虚拟机查找这些java对象

  java虚拟机根据class path来查找java对象 而虚拟机的class path又分为三层

  bootstrap sun boot class path

  extension: java ext dirs

  application: java class path

  三个class path各有对应的classloader 由上而下形成父子关系

  当程序中调用new指令 或者ClassLoader load方法时 其顺序如下

          首先查看application的classloader中是否已有对应的class缓存 如果有则返回 并根据class分配内存 如果没有 接下一步

          首先查看extension的classloader中是否已有对应的class缓存 如果有则返回 并根据class分配内存 如果没有 接下一步

          首先查看bootstrap的classloader中是否已有对应的class缓存 如果有则返回 并根据class分配内存 如果没有 接下一步

          由bootstrap的classloader在其class path中试图加载该class 如果有 则将该class放入cache中 并返回 如果没有 接下一步

          由extension的classloader在其class path中试图加载该class 如果有 则将该class放入cache中 并返回 如果没有 接下一步

          由application的classloader在其class path中试图加载该class 如果有 则将该class放入cache中 并返回 如果没有 则抛出ClassNotFound的exception

    

  Java虚拟机加载这些java对象

  每个java虚拟机都在其启动时产生一个唯一的class heap 并把所有的class instance都分配在其中 其中每个类实例的信息又分两部分 fields域和methods域 每个类实例各自拥有fields 但同一个类的不同实例共享methods

    

  反射

  JVM对反射的处理

  简单例子代码

  import java lang reflect InvocationHandler;

  import java lang reflect Method;

  import java lang reflect InvocationTargetException;

  import java io IOException;

    

  public class Main

  public static void main(String[] args)

  TempImpl t = new TempImpl( temp );

  try

  Method t Talk = t getClass() getMethod( Talk new Class[ ]) ;

  t Talk invoke(t null);

   catch (NoSuchMethodException e)

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

   catch (IllegalAccessException e)

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

   catch (InvocationTargetException e)

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

  

  try

  System in read();

   catch (IOException e)

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

  

  

  

  复杂例子代码

  import java lang reflect InvocationHandler;

  import java lang reflect Method;

  import java lang reflect InvocationTargetException;

  import java io IOException;

    

  public class Main

  public static void main(String[] args)

  TempImpl t = new TempImpl( temp );

  TempImpl t = new TempImpl( temp );

  Temp temp = new Temp ();

  try

  Method t Talk = t getClass() getMethod( Talk new Class[ ]) ;

  Method t Talk = t getClass() getMethod( Talk new Class[ ]) ;

  t Talk invoke(t null);

  t Talk invoke(t null);

  if(t Talk equals(t Talk))

  System out println( equals );

  

  else

  System out println( not equals );

  

  if(t Talk==t Talk)

  System out println( ref equals );

  

  else

  System out println( ref not equals );

  

  t Talk invoke(temp null);

   catch (NoSuchMethodException e)

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

   catch (IllegalAccessException e)

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

   catch (InvocationTargetException e)

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

  

  try

  System in read();

   catch (IOException e)

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

  

  

  

    

  分析 java虚拟机把每个methods当作一个执行单元 该执行单元带有两种签名 类签名和属性签名(public static等) 反射的第一步 验证签名的合法性 验证通过后 顺序执行该method中的指令 当需要访问类实例的fields和传入参数时 由虚拟机注入

    

  动态代理

  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 m ;

  private static Method m ;

  private static Method m ;

  private static Method m ;

  private static Method m ;

    

  public TempProxy(InvocationHandler invocationhandler)  

  super(invocationhandler);

  

    

  public final void Run()   

  try

  h invoke(this m null);

  return;

  

  catch(Error _ex)

  catch(Throwable throwable) 

  throw new UndeclaredThrowableException(throwable);

  

  

    

  public final String toString()

  try

  return (String)h invoke(this m null);

  

  catch(Error _ex)

  catch(Throwable throwable)  

  throw new UndeclaredThrowableException(throwable);

  

  return ;

  

    

  public final int hashCode()

  try

  return ((Integer)h invoke(this m null)) intValue();

  

  catch(Error _ex)

  catch(Throwable throwable)

  throw new UndeclaredThrowableException(throwable);

  

  return ;

  

    

  public final void Talk()

  try

  h invoke(this m null);

  return;

  

  catch(Error _ex)

  catch(Throwable throwable)

  throw new UndeclaredThrowableException(throwable);

  

  

    

  public final boolean equals(Object obj)

  try 

  return ((Boolean)h invoke(this m new Object[]

  obj

  )) booleanValue();

  

  catch(Error _ex)

  catch(Throwable throwable)

  throw new UndeclaredThrowableException(throwable);

  

  return false;

  

    

  static

  try

  m = Class forName( Temp ) getMethod( Run new Class[ ]);

  m = Class forName( java lang Object ) getMethod( toString new Class[ ]);

  m = Class forName( java lang Object ) getMethod( hashCode new Class[ ]);

  m = Class forName( Temp ) getMethod( Talk new Class[ ]);

  m = 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());

  

  

  

cha138/Article/program/Java/hx/201311/25693

相关参考

知识大全 Java中的静态代理和动态代理

Java中的静态代理和动态代理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  代理模式主要有两种

知识大全 动态代码的使用(反射和动态生成类)

  在软件开发尤其是框架和底层开发时为了更灵活的控制代码常常需要进行一些动态的操作比如根据用户的输入等动态的调用类中的方法或者根据数据库表结构用户要求动态的生成一些类然后再动态的调用类中的方法当然使用

知识大全 Java动态程序设计——反射介绍

Java动态程序设计——反射介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java动态程序

知识大全 动态代理

  动态代理  要求测算一个类里面的某个方法的执行时间  直接在一个测试的方法中调用这个类的方法就可以了也可以直接的写在这个类的main方法里面  继承这个类对需要测算时间的方法进行重写方法中这样来写

知识大全 Java 实践: 用动态代理进行修饰

Java实践:用动态代理进行修饰  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  动态代理工具是j

知识大全 .NET简谈反射(动态调用)

.NET简谈反射(动态调用)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  我们继续C#基础知识

知识大全 JAVA 动态代理

JAVA动态代理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在目前的Java开发包中包含了对

知识大全 java动态代理Dynamic Proxy

java动态代理DynamicProxy  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  被代理对

知识大全 Java动态代理机制综合分析及扩展

Java动态代理机制综合分析及扩展  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java动态代

知识大全 Delphi中关于动态代理应用技巧

Delphi中关于动态代理应用技巧  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!本来想上周末没能用