反射机制
反射机制
下面我们一起来探讨一下java的反射机制吧!功能太强大了,哈哈!
(一). 定义
Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
1.1 主要功能
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法
- 生成动态代理
1.2 应用范围
在web应用中不是很多,但反射机制是如今很多流行框架的实现基础,包括Spring、Hibernate等。
1.3 注意
Java通过Reflection API来完成反射机制,在java.lang.reflect包中有Field、Method、Constructor三个类分别用于描述类的属性、方法、构造方法。
1.4 Constructor类
Constructor类用于表示类的构造方法,通过调用Class对象的getConstructor()方法就能获取当前类的构造方法的集合。
1.4.1 Constructor类的方法
String getName()————返回构造方法的名称
Class[] getParameterTypes()————返回当前构造方法的参数类型
int getModifiers()————返回修饰符的整型标识
1.4.2 实践
上代码演示getConstructor()方法获取指定类的构造方法
1 package com.itsuper.p2.reflection; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Modifier; 5 6 public class ConstructorReflectionDemo { 7 8 public static void main(String[] args) { 9 String name = "java.util.Date"; 10 try { 11 Class c1 = Class.forName(name); 12 System.out.println("class " + name + "{"); 13 getConstructors(c1); 14 System.out.println("}"); 15 } catch (ClassNotFoundException e) { 16 System.out.println("Check name of the class!"); 17 } 18 } 19 20 public static void getConstructors(Class c1) { 21 //返回声明的所有构造方法包括私有的和受保护的,但不包括超类构造方法 22 Constructor[] cons = c1.getDeclaredConstructors(); 23 for(int i=0;i<cons.length;i++){ 24 Constructor c = cons[i]; 25 //返回构造方法的名称 26 String name = c.getName(); 27 //通过Modifier类获取修饰符 28 System.out.print(" " + Modifier.toString(c.getModifiers())); 29 System.out.print(" " + name + "("); 30 //获取构造方法的参数 31 Class[] paramTypes = c.getParameterTypes(); 32 //打印构造方法的参数 33 for(int j=0;j<paramTypes.length;j++){ 34 if(j>0){ 35 System.out.print(","); 36 } 37 System.out.print(paramTypes[j].getName()); 38 } 39 System.out.println(")"); 40 } 41 } 42 }
1.5 Method类
Method类提供关于类或接口上某个方法的信息,它是用来封装反射类方法的一个类。
1.5.1 Method类方法
String getName()————返回方法的名称
Class[] getParameterTypes()————返回当前方法的参数类型
int getModifiers()————返回修饰符的整型标识
Class getReturnType()————返回当前方法的返回类型
1.5.2 实践
代码演示getMethod()方法获取指定类的所有的方法信息。
1 package com.itsuper.p2.reflection; 2 3 import java.lang.reflect.Method; 4 import java.lang.reflect.Modifier; 5 6 public class MethodReflectionDemo { 7 public static void main(String[] args) { 8 String name = "java.util.Date"; 9 try { 10 //返回指定字符串所代表的类的Class对象 11 Class c1 = Class.forName(name); 12 System.out.println("class " + name + "\n{"); 13 getMethods(c1); 14 System.out.println("}"); 15 } catch (ClassNotFoundException e) { 16 System.out.println("Check name of the Class"); 17 } 18 System.exit(0); 19 } 20 21 public static void getMethods(Class c1) { 22 //返回声明的所有的方法包括私有的和受保护的,但不包括超类方法 23 Method[] methods = c1.getDeclaredMethods(); 24 //返回公共方法,包括从父类继承的公共方法 25 // Method[] methods1 = c1.getMethods(); 26 for(int i=0;i<methods.length;i++){ 27 //获取单个method方法 28 Method m = methods[i]; 29 //获取当前方法的返回类型 30 Class retype = m.getReturnType(); 31 //获取方法名 32 String name = m.getName(); 33 System.out.print(" " + Modifier.toString(m.getModifiers()));//修饰符 34 System.out.print(" " + retype.getName() + " " + name + "(");//返回类型、方法名 35 //打印参数信息 36 Class[] paramtypes = m.getParameterTypes(); 37 for(int j=0;j<paramtypes.length;j++){ 38 if(j>0){ 39 System.out.print(","); 40 } 41 //打印参数名 42 System.out.print(paramtypes[j].getName()); 43 } 44 System.out.println(");"); 45 } 46 } 47 }
1.6 Field类
Field类提供有关类或接口的属性信息。
1.6.1 Field类的方法
String getName()————返回方法的名称
Class[] getType()————返回当前属性的参数列表
1.6.3 实践
直接上代码,通过代码理解getField()方法用于获取指定类或接口定义的属性信息。
1 package com.itsuper.p2.reflection; 2 3 import java.lang.reflect.Field; 4 import java.lang.reflect.Modifier; 5 6 public class FieldReflectionDemo { 7 8 public static void main(String[] args) { 9 String name = "java.util.Date"; 10 try { 11 Class c1 = Class.forName(name); 12 System.out.println("class " + name + "\n{"); 13 getFields(c1); 14 System.out.println("}"); 15 } catch (ClassNotFoundException e) { 16 System.out.println("Check name of the class !"); 17 } 18 } 19 20 public static void getFields(Class c1) { 21 //返回声明的所有的属性包括私有的和受保护的,但不包括超类属性 22 Field[] fields= c1.getDeclaredFields(); 23 for(int i=0;i<fields.length;i++){ 24 Field field = fields[i]; 25 Class type = field.getType(); 26 String name = field.getName(); 27 System.out.print(" "+ Modifier.toString(field.getModifiers())); 28 System.out.println(" " + type.getName() + " " + name + ";"); 29 30 } 31 } 32 }
要注意:Field类的getDeclaredFields()方法将返回包括私有的和受保护的所有属性定义,但不包括父类的属性;getFields()方法返回的属性列表将包括从父类继承的公共属性。