@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);