------<a href="http://www.itheima.com" target="blank">java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
反射机制
下面我们一起来探讨一下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()方法获取指定类的构造方法
1packagecom.itsuper.p2.reflection;23importjava.lang.reflect.Constructor;4importjava.lang.reflect.Modifier;56publicclassConstructorReflectionDemo {78publicstaticvoidmain(String[] args) {9String name = "java.util.Date";10try{11Class c1 =Class.forName(name);12System.out.println("class " + name + "{");13getConstructors(c1);14System.out.println("}");15}catch(ClassNotFoundException e) {16System.out.println("Check name of the class!");17}18}1920publicstaticvoidgetConstructors(Class c1) {21//返回声明的所有构造方法包括私有的和受保护的,但不包括超类构造方法22Constructor[] cons =c1.getDeclaredConstructors();23for(inti=0;i<cons.length;i++){24Constructor c =cons[i];25//返回构造方法的名称26String name =c.getName();27//通过Modifier类获取修饰符28System.out.print(" " +Modifier.toString(c.getModifiers()));29System.out.print(" " + name + "(");30//获取构造方法的参数31Class[] paramTypes =c.getParameterTypes();32//打印构造方法的参数33for(intj=0;j<paramTypes.length;j++){34if(j>0){35System.out.print(",");36}37System.out.print(paramTypes[j].getName());38}39System.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()方法获取指定类的所有的方法信息。
1packagecom.itsuper.p2.reflection;23importjava.lang.reflect.Method;4importjava.lang.reflect.Modifier;56publicclassMethodReflectionDemo {7publicstaticvoidmain(String[] args) {8String name = "java.util.Date";9try{10//返回指定字符串所代表的类的Class对象11Class c1 =Class.forName(name);12System.out.println("class " + name + "\n{");13getMethods(c1);14System.out.println("}");15}catch(ClassNotFoundException e) {16System.out.println("Check name of the Class");17}18System.exit(0);19}2021publicstaticvoidgetMethods(Class c1) {22//返回声明的所有的方法包括私有的和受保护的,但不包括超类方法23Method[] methods =c1.getDeclaredMethods();24//返回公共方法,包括从父类继承的公共方法25//Method[] methods1 = c1.getMethods();26for(inti=0;i<methods.length;i++){27//获取单个method方法28Method m =methods[i];29//获取当前方法的返回类型30Class retype =m.getReturnType();31//获取方法名32String name =m.getName();33System.out.print(" " + Modifier.toString(m.getModifiers()));//修饰符34System.out.print(" " + retype.getName() + " " + name + "(");//返回类型、方法名35//打印参数信息36Class[] paramtypes =m.getParameterTypes();37for(intj=0;j<paramtypes.length;j++){38if(j>0){39System.out.print(",");40}41//打印参数名42System.out.print(paramtypes[j].getName());43}44System.out.println(");");45}46}47}
1.6 Field类
Field类提供有关类或接口的属性信息。
1.6.1 Field类的方法
String getName()————返回方法的名称
Class[] getType()————返回当前属性的参数列表
1.6.3 实践
直接上代码,通过代码理解getField()方法用于获取指定类或接口定义的属性信息。
1packagecom.itsuper.p2.reflection;23importjava.lang.reflect.Field;4importjava.lang.reflect.Modifier;56publicclassFieldReflectionDemo {78publicstaticvoidmain(String[] args) {9String name = "java.util.Date";10try{11Class c1 =Class.forName(name);12System.out.println("class " + name + "\n{");13getFields(c1);14System.out.println("}");15}catch(ClassNotFoundException e) {16System.out.println("Check name of the class !");17}18}1920publicstaticvoidgetFields(Class c1) {21//返回声明的所有的属性包括私有的和受保护的,但不包括超类属性22Field[] fields=c1.getDeclaredFields();23for(inti=0;i<fields.length;i++){24Field field =fields[i];25Class type =field.getType();26String name =field.getName();27System.out.print(" "+Modifier.toString(field.getModifiers()));28System.out.println(" " + type.getName() + " " + name + ";");2930}31}32}
要注意:Field类的getDeclaredFields()方法将返回包括私有的和受保护的所有属性定义,但不包括父类的属性;getFields()方法返回的属性列表将包括从父类继承的公共属性。