本节概览:介绍反射的基本用法,获取对象、获取成员变量和获取方法。
1 解析
1.1 Class对象获取
用一个Class类表示一个类的定义信息,一个Class的实例对象可以保存一个类的信息。
1. 通过对象获取
1 2 |
Date date; Class c=date.getclass(); |
2. 通过Class的静态forName方法
1 2 |
String className= "java.util.Date" Class c=Class.forName(className) |
3 通过类的class方法
1 |
Class c = Date.class |
1.2 分析类
为了分析类,引入了Field、Method和Constructor三个类。
1. Class类的getFields、getMethods和getContractors方法将分别返回类提供的public类型的数据域、方法和构造器三种对象的数组。
2. Class类的getDeleareFields、getDeclareMethods和getDeclaredConstructors方法将分别返回类型不仅有public类型,还有私有和受保护的类型。
3. 通过函数
1 |
getDeclaredMethod(String methodName) |
获取一个方法Method对象
4. 举例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
/** * 一个类的属性就包括Filed、Constructor、Method三个元素 */ public class ReflectAnalysis { /** * 显示一个类的构造器Constructor的信息 * * @param c */ public static void printConstractors(Class c) { Constructor[] constructors = c.getDeclaredConstructors(); for(Constructor constructor : constructors){ String name = constructor.getName(); //打印参数类型 Class[] paramTypes = constructor.getParameterTypes(); for(int j=0;j<paramTypes.length;j++){ System.out.println(paramTypes[j].getName()); } } } /** * 返回方法Method的信息 * @param c */ public static void printMethodInfo(Class c){ Method[] methods = c.getDeclaredMethods(); for(Method method : methods){ String methodName = method.getName(); System.out.println("方法名:"+methodName); String modifiers = Modifier.toString(method.getModifiers()); System.out.println("方法作用域:"+modifiers); if(Modifier.isPublic(method.getModifiers())){ System.out.println("public方法"); } if (Modifier.isPrivate(method.getModifiers())){ System.out.println("private方法"); } Class retType = method.getReturnType(); String retTypeName = retType.getName(); System.out.println("返回类型:"+retTypeName); } } /** * 返回域Field的信息 * @param c */ public static void printFieldsInfo(Class c){ Field[] fields = c.getDeclaredFields(); for(Field field : fields){ Class fieldType = field.getType(); String fieldTypeName = fieldType.getName(); System.out.println("域的类型名:"+fieldTypeName); if(Modifier.isPublic(field.getModifiers())){ System.out.println("public方法"); } if (Modifier.isPrivate(field.getModifiers())){ System.out.println("private方法"); } String modifiers = Modifier.toString(field.getModifiers()); System.out.println("作用域:"+modifiers); } } } |
1.3 动态利用反射
1. Class对象的newInstance方法用来创建实例对象。
2. Field相关方法
1 2 3 4 5 |
Student student = new Student(); Class c = student.getClass(); Filed filed = c.getDeclardField("name"); fileld.setAccessible(true);//因为域在类中都是private的 Object object = field.get(student);//得到name域的值 |
3. Method方法
1 2 |
Method method String value = method.invoke(实例对象,方法的参数)。 |
2 反射应用
Spring IOC,根据在xml配置的bean或者使用注解(@contract/@service/@Repository)来创建一个实例化bean对象保存到上下文。