java反射常用方法(面试常见)在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中:1.Class类:代表一个类。2.Field类:代表类的成员变量(成员变量也称为类的属性)。3.Method类:代表类的方法。4.Constructor类:代表类的构造方法。5.Array类:提供了动态创建数组,以及访问数组元素的静态方法。◆.Class类在java.lang.Object类中定义了getClass()方法,因此对于任意一个Java对象,都可以通过此方法获得对象的类型。Class类是ReflectionAPI中的核心类,它有以下方法(1)获得对象的类型:getName():获得类的完整名字。getFields():获得类的public类型的属性。getDeclaredFields():获得类的所有属性。getMethods():获得类的public类型的方法。getDeclaredMethods():获得类的所有方法。getMethod(Stringname,Class[]parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes参数指定方法的参数类型。getConstrutors():获得类的public类型的构造方法。getConstrutor(Class[]parameterTypes):获得类的特定构造方法,parameterTypes参数指定构造方法的参数类型。newInstance():通过类的不带参数的构造方法创建这个类的一个对象。(2)通过默认构造方法创建一个新的对象:ObjectobjectCopy=classType.getConstructor(newClass[]{}).newInstance(newObject[]{});(3)获得对象的所有属性:Fieldfields[]=classType.getDeclaredFields();Class类的getDeclaredFields()方法返回类的所有属性,包括public、protected、默认和private访问级别的属性。以上代码先调用Class类的getConstructor()方法获得一个Constructor对象,它代表默认的构造方法,然后调用Constructor对象的newInstance()方法构造一个实例。(4)获得每个属性相应的getXXX()和setXXX()方法,然后执行这些方法,把原来对象的属性复制到新的对象中:推荐阅读:[java]viewplaincopyprint?1.Fieldfield=fields[i];2.StringfieldName=field.getName();3.StringfirstLetter=fieldName.substring(0,1).toUpperCase();4.//获得和属性对应的getXXX()方法的名字StringgetMethodName=get+firstLetter+fieldName.substring(1);5.//获得和属性对应的setXXX()方法的名字StringsetMethodName=set+firstLetter+fieldName.substring(1);6.//获得和属性对应的getXXX()方法7.MethodgetMethod=classType.getMethod(getMethodName,newClass[]{});8.//获得和属性对应的setXXX()方法9.MethodsetMethod=classType.getMethod(setMethodName,newClass[]{field.getType()});10.//调用原对象的getXXX()方法11.Objectvalue=getMethod.invoke(object,newObject[]{});12.System.out.println(fieldName+:+value);13.//调用复制对象的setXXX()方法14.setMethod.invoke(objectCopy,newObject[]{value});}◆.Method类的invoke(Objectobj,Objectargs[])方法接收的参数必须为对象,如果参数为基本类型数据,必须转换为相应的包装类型的对象。invoke()方法的返回值总是对象,如果实际被调用的方法的返回类型是基本类型数据,那么invoke()方法会把它转换为相应的包装类型的对象,再将其返回。◆.Array类java.lang.Array类提供了动态创建和访问数组元素的各种静态方法。如例程10-4所示的ArrayTester1类的main()方法创建了一个长度为10的字符串数组,接着把索引位置为5的元素设为“hello”,然后再读取索引位置为5的元素的值。[java]viewplaincopyprint?1.importjava.lang.reflect.*;2.publicclassArrayTester1{3.publicstaticvoidmain(Stringargs[])throwsException{4.ClassclassType=Class.forName(java.lang.String);5.//创建一个长度为10的字符串数组6.Objectarray=Array.newInstance(classType,10);7.//把索引位置为5的元素设为hello8.Array.set(array,5,hello);9.//读取索引位置为5的元素的值10.Strings=(String)Array.get(array,5);11.System.out.println(s);12.}13.}java反射详解本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解。下面开始正文。【案例1】通过一个对象获得完整的包名和类名[java]viewplaincopyprint?1.packageReflect;2.3./**4.*通过一个对象获得完整的包名和类名5.**/6.classDemo{7.//othercodes...8.}9.10.classhello{11.publicstaticvoidmain(String[]args){12.Demodemo=newDemo();13.System.out.println(demo.getClass().getName());14.}15.}好看的小说:=allvisit【运行结果】:Reflect.Demo添加一句:所有类的对象其实都是Class的实例。【案例2】实例化Class类对象[java]viewplaincopyprint?1.packageReflect;2.classDemo{3.//othercodes...4.}5.6.classhello{7.publicstaticvoidmain(String[]args){8.Class?demo1=null;9.Class?demo2=null;10.Class?demo3=null;11.try{12.//一般尽量采用这种形式13.demo1=Class.forName(Reflect.Demo);14.}catch(Exceptione){15.e.printStackTrace();16.}17.demo2=newDemo().getClass();18.demo3=Demo.class;19.20.System.out.println(类名称+demo1.getName());21.System.out.println(类名称+demo2.getName());22.System.out.println(类名称+demo3.getName());23.24.}25.}【运行结果】:类名称Reflect.Demo类名称Reflect.Demo类名称Reflect.Demo【案例3】通过Class实例化其他类的对象通过无参构造实例化对象[java]viewplaincopyprint?1.packageReflect;2.3.classPerson{4.5.publicStringgetName(){6.returnname;7.}8.publicvoidsetName(Stringname){9.this.name=name;10.}11.publicintgetAge(){12.returnage;13.}14.publicvoidsetAge(intage){15.this.age=age;16.}17.@Override18.publicStringtoString(){19.return[+this.name++this.age+];20.}21.privateStringname;22.privateintage;23.}24.25.classhello{26.publicstaticvoidmain(String[]args){27.Class?demo=null;28.try{29.demo=Class.forName(Reflect.Person);30.}catch(Exceptione){31.e.printStackTrace();32.}33.Personper=null;34.try{35.per=(Person)demo.newInstance();36.}catch(InstantiationExceptione){37.//TODOAuto-generatedcatchblock38.e.printStackTrace();39.}catch(IllegalAccessExceptione){40.//TODOAuto-generatedcatchblock41.e.printStackTrace();42.}43.per.setName(Rollen);44.per.setAge(20);45.System.out.println(per);46.}47.}【运行结果】:[Rollen20]但是注意一下,当我们把Person中的默认的无参构造函数取消的时候,比如自己定义只定义一个有参数的构造函数之后,会出现错误:比如我定义了一个构造函数:[java]viewplaincopyprint?1.publicPerson(Stringname,intage){2.this.age=age;3.this.name=name;4.}然后继续运行上面的程序,会出现:java.lang.InstantiationException:Reflect.Personatjava.lang.Class.newInstance0(Class.java:340)atjava.lang.Class.newInstance(Class.java:308)atReflect.hello.main(hello.java:39)Exceptioninthreadmainjava.lang.NullPointerExceptionatReflect.hello.main(hello.java:47)所以大家以后再编写使用Class实例化其他类的对象的时候,一定要自己定义无参的构造函数【案例】通过Class调用其他类中的构造函数(也可以通过这种方式通过Class创建其他类的对象)[java]viewplaincopyprint?1.packageReflect;2.3.importjava.lang.reflect.C