反射
反射库(reflection library)提供了一个非常丰富且精心设计的工具集,以便编写能够动态操作java代码的程序。
反射(reflective)是一个能够分析类能力的程序。
反射机制的作用是:
- 运行时分析类的能力
- 运行时查看对象
- 实现通用数组操作代码。
- 利用Method对象。
利用反射获取Class类型的实例方法有三种。
- getClass()方式。
public static void main(String[] args) {
Employee e = new Employee();
Class employee = e.getClass();
System.out.println(employee.getName());
}
- 静态方法ForName();
public static void main(String[] args) {
String ClassName = "reflective.Employee";
Class employee;
try {
employee = Class.forName(ClassName);
System.out.println(employee.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
- 如果T是任意的java类型,T.class将代表匹配对象。例如:
public static void main(String[] args) {
Class employee = Employee.class;
System.out.println(employee.getName());
}
创建对象的实例可以用newInstance方法,newInstance方法调用默认的构造器,初始化新建对象。
在 java.lang.reflect中含有三个类Filed、Method、Constructor分别用来描述域、方法、构造器。三个类中有一个叫做getName的方法用来返回项目名称。
getmodifiers():什么都不加 是0 , public 是1 ,private 是 2 ,protected 是 4,static 是 8 ,final 是 16。
getParameterTypes():用来描述参数类型的方法。
getReturnType():用来描述返回值得类型。
public static void main(String[] args) {
String ClassName = "reflective.Employee";
Class employee;
try {
employee = Class.forName(ClassName);
Field[] fields = employee.getDeclaredFields();
for (Field f : fields){
Class type = f.getType();
String name = f.getName();
System.out.println(name);
}
Method[] methods = employee.getDeclaredMethods();
for (Method m : methods){
System.out.println(m.getName());
System.out.println(m.getReturnType());
Class[] paramTypes = m.getParameterTypes();
System.out.println(m.getModifiers());
for(int j = 0;j< paramTypes.length;j++){
if(j>0) System.out.println(",");
System.out.println(paramTypes[j].getName());
}
}
Constructor[] constructors = employee.getConstructors();
for(Constructor c :constructors){
String Modifiers = Modifier.toString(c.getModifiers());
System.out.println(c.getName());
Class[] paramTypes = c.getParameterTypes();
for(int j= 0;j< paramTypes.length;j++){
System.out.println(paramTypes[j].getName());
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
反射的访问机制受限于java的访问控制。然而,如果一个Java程序没有受到安全管理机制,就可以覆盖访问控制。为了达到这个目的,需要调用Filed、Method、或Constructor对象的setAccessible方法。
setAccessible()。
调用任意方法可以用invoke()
返回一个给定具体类型维度的方法。newInstance(Class componentType,int length);
newInstance(Class componentType,int[] lengths);