什么是反射?
Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。而这也是Java被视为动态(或准动态,为啥要说是准动态,因为一般而言的动态语言定义是程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。)语言的一个关键性质。
获取Class的三种方式
//1.通过类名.Class Class c = Student.Class; //2.通过classforName,引号里面是这个类所在的全限定名 Class c = Class.forName(""); //3.通过该类的对象创建 Student student = new Student(); Class c = student.Class;
获取该类及其从父类继承下来的所有公共public属性(c.getFields())
//获取该类的属性(包括继承来的) Field[] fields = c.getFields();//获取该类及其父类中所有的public属性 for (Field field : fields) { //遍历属性 System.out.println(field.getName()); //获取属性的名字 System.out.println(field.getType()); //获取属性类型 System.out.println(Modifier.toString(field.getModifiers())); //获取属性的访问控制符对应的int值,在将这个int值转换成转换成控制符 }
获得该类自定义-声明的属性(c.getDeclearFields())
//获取该类自己定义-声明的属性 Field[] declaredFields = c.getDeclaredFields(); for (Field declaredField : declaredFields) { System.out.println(declaredField.getName()); //获取属性的名字 System.out.println(declaredField.getType()); //获取属性类型 }
获得该类定义的所有构造方法(c.getConstructors())
Constructor[] constructors = c.getConstructors(); for (Constructor constructor : constructors) { System.out.println(constructor.getName()); System.out.println(constructor.getParameterCount()); Parameter[] parameters = constructor.getParameters();//获得该构造方法的参数 for (Parameter parameter : parameters) { System.out.println(parameter.getName()); } } Student student = (Student) constructors[1].newInstance(180,"张三",21); //得到这个类的构造方法信息后,通过实例化创建一个Student对象 System.out.println(student.getName());
获得该类的普通方法
Method[] methods = c.getMethods(); for (Method method : methods) { System.out.println(method.getReturnType()); System.out.println(method.getName()); } System.out.println(methods[2].invoke(student, "lisi")); //通过student这个对象调用这个对象里面的第三个方法,传入一个值是lisi c.getMethod("study",String.class).invoke(student,"lisi");