实训--day02反射

来源:互联网 发布:管家婆软件打印机关闭 编辑:程序博客网 时间:2024/06/05 17:00

实训第二天:反射

反射:把Java类中的各种成分映射成一个个的Java对象。即利用反射技术对以个类进行解剖,把各个组成部分映射成一个对象。一般反射都是用再框架中的。

java.lang.reflect;

反射包中有几个很重要的类,Class,Method,Constructors,Field

Class;获得要操作的类的class属性。得到一个类的全类名对象有三种方法:

1:类名.class

2:对象.getClass()

3:Class.forName(“带路径的全类名”) 。第三种是最常用的。

Class对象是反射的基础,如果没有class去获取类对象,就没有后面反射的一系列操作。反射都是基于class获取到的对象进行的。

Constructor:用于获取相应的类的所有构造方法的。

步骤如下:

1:获得全类名的class对象
Class<?> clazz=Class.forName("com.xishiyou.khl.practice.Person");
2:通过class对象获得所有的构造器并放置在一个数组中
Constructor<?>[] constructors=clazz.getConstructors();
3:通过每个构造器对象获得要操作的类的实例对象
Person person=(Person) constructors[0].newInstance();
4:通过实例对象操作方法
Person person1=(Person) constructors[1].newInstance("孔海海",22);


Method:获取对应类中的方法,可以只获取在类中定义的方法(getDeclaredMethods()),也可以获取包括继承自父类的方法在内的全部方法(getMethods())。

使用步骤如下:

1:获得全类名的class对象
Class<?> clazz=Class.forName("com.xishiyou.khl.practice.Person");
2:获得该类的所有方法并放入一个method数组中
Method [] method=clazz.getMethods();

获取到对象之后,之一通过数组的每个元素分别取获取到每个方法的访问修饰符,返回值类型,方法名,参数列表等一系列的参数。

int getModifiers():得到访问修饰符对应的编号,再用Modifier.toString(modifiers)转换成相应的访问修饰符。

Class<?> getReturnType():获得返回值类型

Class<?> getParameterTypes():获得参数类型,因为可能不止一个,所以返回的是一个数组。


field:用于存放类中的属性。因为类中的属性为了保证安全性,都会使用private修饰,不让外界直接访问而是提供相应的存取方法,有了field,我们可以获得到对应的属性,通过一个参数的设置,使得可以直接操作那个属性。

一般步骤如下:

1:获得全类名的class对象
Class<?> clazz=Class.forName("cn.shixun.khl.classdemo.Person");
2:通过class对象获得要操作的类的实例对象
Person person=(Person) clazz.newInstance();
3:获得属性的field
Field nameField=clazz.getDeclaredField("name");
4:设置属性的权限为可以操作
nameField.setAccessible(true);
5:为属性进行赋值操作
nameField.set(person, "孔海海");
6:取出属性值。
System.out.println(nameField.get(person));