什么是反射?
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");
|