技术开发 频道

JAVA程序类加载及其反射机制

  JVM类加载机制

  全盘负责

  父类委托:所谓父类委托是先让parent(父)类加载器试图加载该Class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类。

  缓存机制

  通过反射查看类信息

  Java程序中获得Class对象通常有如下三种方法:

  a) 使用Class类的forName()静态方法.该方法需要传入字符串参数,该字符串参数的值是某个类的全限定类名(必须添加完整包名)。

  b) 调用某个类的class属性来获取该类对应的Class对象。

  c) 调用某个对象的getClass()方法,该方法是java.lang.Object类中的一个方法,所以所有java对象都可以调用该方法,该方法将会返回该对象所属类对应的Class对象。

  b方法:代码更安全,程序在编译阶段就可以检查需要访问的Class对象是否存在。

  程序性能提高,因为这种方法无需调用方法,所以性能更好。

  一旦获得某个类所对应的Class对象后,就可以调用Class对象的方法来获得该对象和该类的真实信息。

  getDeclared 与访问级别无关,显式声明的。

  get 获得所有的但只是public,包括继承的。

  使用反射生成并操作对象

  Class对象可以获得该类里包括的方法(由Methode对象表示),构造器(由Constructor对象表示),Field(Field对象表示),这三个类都定义在java.lang.reflect包下,并实现了java.lang.reflect.Member接口,程序可以通过Method对象来执行对应的方法,通过Constructor对象来调用对应的构造器创建对象,能通过Field对象直接访问并修改对象的属性值。

  通过反射来生成对象有如下两种方式:

  a) 使用Class对象的newInstance()方法来创建该Class对象对应类的实例,这种方法要求该Class对象的对应类有默认构造器,而执行newInstance()方法时实际上是利用默认构造器来创建该类的实例。

  b) 先利用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建该Class对象对应类的实例,通过这种方式可以选择使用某个类的制定构造器来创建实例。

  实际上只有当程序需要动态地创建该对象时才会考虑使用反射,通常在开发通用性比较广的框架和基础平台时可能会大量使用反射。

  当获得某个类对应的Class对象后,就可以通过该Class对象的getMethods()方法或者getMethod()方法来获取全部或指定方法----这两个方法的返回值是Method对象数组,或者Method对象。

  每个Method对象包含一个方法,获得Method对象后,程序就可通过该Method来调用对应方法,在Method里包含一个invoke方法。

  Obejct invoke(Object obj, Object …args);该方法中的obj是执行该方法的主调,后面的args是执行该方法时传入该方法的实参。

  当通过Method的invoke方法来调用对应的方法时,Java会要求程序必须有调用该方法的权限,如果程序确实需要调用某个对象的invoke方法,可以先调用Method对象的如下方法:

  setAccessible(boolean flag):将flag对象的accessible标志设置为指示的Boolean值。

  true表示该Method在使用时应该取消Java语言访问权限检查。

0
相关文章