@author ixenos

摘要:优化程序启动策略、在运行时使用反射分析类的结构和对象

 

 

 

优化程序启动策略


在启动时,包含main方法的类被加载。它会加载所有它需要的类。这些被加载的类又要加载它们需要的类,以此类推,这是JVM的动态加载机制。

对于一个大型的应用程序,这将消耗很多时间,用户体验不好。此时可以通过反射来优化程序启动策略,要确保包含main方法的类没有显示地引用其他的类。

首先,显式一个启动动画,然后通过调用Class.forName手动加载其他的类,预加载。

 

 

在运行时使用反射分析类的结构


在java.lang.reflect包中有三个类Field、Method和Constructor,分别用于描述类的域、方法和构造器。

这三个类都有getName方法返回项目的名称

Field类的getType方法可返回描述域所属类型的Class对象

Method和Constructor类都有报告参数的方法,Method类还有报告返回类型的方法

这三个类还有getModifiers方法返回整数数值,用不同的位开关描述public和static这样的修饰符的使用状况。还可以使用java.lang.reflect.Modifier类的静态方法分析getModifiers返回的整数数值,如isPublic、isFinal、isPrivate

Class类中的getFields、getMethods和getConstructors方法返回类提供的public域、方法和构造器数组,其中包括超类的公有成员

Class类中的getDeclareFields、getDeclareMethods和getDeclaredConstructors方法将返回类中声明的所有域、方法和构造器,不包括超类的成员

 

 

在运行时使用反射分析对象


 从上一节知道如何查看任意对象的数据域名称和类型:获得对应的Class对象,通过Class对象调用getDeclareFields

本节进一步查看数据域的实际内容(对对象进行分析)

 

1.查看数据域的关键方法是Field类中的get方法

  如果f是一个Field类型的对象,obj是某个包含f域的类的对象,f.get(obj)将返回一个对象,其值为obj域的当前值

Employee harry = new Employee("Harry Hacker", 35000, 10, 1, 1989);
//反射分析类
Class c1 = harry..getClass();
Field f = c1.getDeclaredField("name");
//反射分析对象
Object v = f.get(harry);
View Code

相关文章: