reflect 反射
动态性,描述语言的动态,java是有一定动态性的语言。
- 体现在可以在运行期探究和使用编译期未知的东西,包括类,构造,属性,方法等等。
类加载:由类加载期完成,类的class文件被读入内存后,就会创建一个class对象,类的所有信息就会放入class对象中,同一个类只被载入一次。
- 连接:把类的二进制数据合并到JRE中。
- 初始化:JVM负责对类进行初始化,也就是对静态属性进行初始化。
一,反射产生对象
1.获取class对象
- 1.1根据实例对象获取class对象,
- 实现方法:调用实例对象的getClass(),该方法来自object类
- 动态性:无
- 适用范围:只能适用引用数据类型
- 1.2根据类型名获取Class对象
- 实现方法:调用类型名.class
- 适用范围:基本,引用,甚至包括void的
- 动态性:无
- 1.3根据类型的字符串名称获取对象(唯一一个可以配置)
- 实现方法:调用class.forName(“类的限定名”)
- 适用范围:只有类类型,包括接口
- 动态性:有
- 1.1根据实例对象获取class对象,
2.通过class对象探究这个类的信息
- 2-1探究类的声明部分的信息
- String packageName = stuClass.getPackage().getName();//得到全类名
- System.out.println(“package”+packageName+”;”);
- String className = stuClass.simpleName();//得到简单类名
- int classMod = stuclass.getModifiers();//得到修饰符,返回的数字
- 2-2探究属性
- Field[] allpublicFields = stuClass.getFields();//得到所有公共属性
- Field[] allFields = stuClass.get.DeclaredFields();//得到所有被申明的属性
- 2-3探究构造
- Constructor[] allPublicCons = stuClass.getConstructor();//得到所有的公共构造
- Constructor[] allCons = stuClass.getDeclaredConstructor();
- (class…)当数组用来做参数的时候,三个点的申明方式是语法糖,外部的调用者无须创建数组实参,内部的实现者,任然按数组的方式使用形参
2-4探究方法
- Method[] allPublicMethods = stuClass2.getMethods();//所有公开的方法
- Method[] allMethods = stuClass2.getDeclaredMethods();//所有被申明的方法
- try {
- Method thePublicMethod = stuClass2.getMethod(“thst2”, int.class);//指定的公共的方法
- Method theMethod = stuClass2.getDeclaredMethod(“test3”, int.class,String.class);
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- } catch (SecurityException e) {
- e.printStackTrace();
- }
3.操作从class中探究出的信息
二,通过反射探究类(属性,方法等)
三,在运行期探究使用任意方法,任意属性,任意构造,从而体会反射的动态性