JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
一般情况下,如果我们要调用一个对象的方法或者属性,程序员需要先获得这个对象有哪些方法或者属性;反射就是程序员不需要提前知道有哪些属性或者方法,可以由程序自己查询和判断调用哪一个属性或者方法。
简而言之,反射是被动获取信息的一种方式。
具体用法如下:
1 创建一个学生类Student
public class Student { public String name; public String tell; public String address; private char sex; public void eat(){ System.out.println(name+"----------"+"吃苹果"); } public Student() { super(); } public Student(String name, String tell, String address, char sex) { super(); this.name = name; this.tell = tell; this.address = address; this.sex = sex; } public void show(String name,String tell,String address){ System.out.println(name+"---"+tell+"---"+address); } }
2 在main方法中调用该类
public static void main(String[] args) { Class clazz = Student.class; //获取所有的属性(包括私有) Field[] fds = clazz.getDeclaredFields(); for(Field f:fds){ System.out.println(f.getName()); System.out.println(f.getModifiers()); System.out.println("------------------"); } System.out.println("=================="); //获取所有的方法 Method[] method = clazz.getDeclaredMethods(); for(Method m:method){ System.out.println(m.getName()); System.out.println(m.getReturnType()); System.out.println(m.getModifiers()); System.out.println(m.getParameterCount()); Class[] c = m.getParameterTypes(); for(int i=0;i<m.getParameterCount();i++){ System.out.println(c[i]); } System.out.println("-----------------------"); } System.out.println("==========================="); try { Field field = clazz.getField("name"); System.out.println(field.getModifiers()); Method m = clazz.getMethod("eat"); Object obj = clazz.newInstance(); field.set(obj, "XXXXX"); m.invoke(obj); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } }另外一种加载该类的方法如下
public static void main( String[] args ) { try { Class clazz = Class.forName("reflect.Student"); //获取当前类的所有公有属性 Field[] field = clazz.getFields(); for(Field f:field){ System.out.println(f.getName());//属性名 System.out.println(f.getModifiers());//属性修饰符 1:公有 2:私有 System.out.println(f.getType());//属性类型 System.out.println("--------------------"); } System.out.println("=========================="); //获取所有的公有方法 Method[] methods = clazz.getMethods(); for(Method m:methods){ System.out.println(m.getName());//方法名 System.out.println(m.getReturnType());//方法返回类型 System.out.println(m.getParameterCount());//方法参数个数 System.out.println("-----------------------"); } System.out.println("==========================="); //获取所有的构造方法 Constructor[] cttrs = clazz.getConstructors(); for(Constructor cttr:cttrs){ System.out.println(cttr.getName());//构造方法名 System.out.println(cttr.getParameterCount());//构造方法参数个数 Class[] c = cttr.getParameterTypes();//参数类型 for(int i=0;i<cttr.getParameterCount();i++){ System.out.println(c[i]); } System.out.println("----------------"); } System.out.println("=========================="); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } }