Day14_75_反射(reflect)
反射
-
反射的基本概念
-
反射是由Smith在1982年首次提出,主要是指程序可以访问,检测,修改它本身状态或行为的一种能力。并且能够根据自身行为的状态或结果,调整和修改所描述行为的状态和相关语义。
-
java 中反射是一种强大的工具,它能够创建灵活的代码,这些代码可以在运行时装配,无需再组件之间进行源码链接,反射允许我们的代码在编写或执行时,使我们的程序能够接入装载到jvm中类的内部信息,而不是源代码中
选定的类协作代码,这使反射成为构建灵活的应有的主要工具,但是如果使用不到会适得其反。
-
-
以下是反射机制中的类和对象:
- java.lang.Class Class c = new Class(); Class类代表整体 包含:构造器方法 属性 修饰符 方法 - java.lang.reflect.Constructor Constructor = new Constructor(); 构造器
-
java.lang.reflect.Field Field f = new Field(); 属性
-
java.lang.reflect.Method Method = new Method(); 方法
-
java.lang.reflect.Modifier Modifier = new Modifier(); 修饰符
-
-
反射机制的作用?
-
reflect 机制可以进行反编译 : .class-->.java
-
reflect 机制可以访问java 对象的属性、方法、构造方法等。
-
-
反射机制的两个缺点
-
性能问题,使用反射基本上是一种解释操作,我们可以告诉jvm我们希望作什么,并且让它满足我们的要求,用于字段和方法接入时反射要远慢于直接代码,性能问题的程度取决于程序中如何使用反射,如果它用于程序运行中很少
涉及的部分,影响较小。 -
使用反射会模糊程序内即将要发生的事情,程序员希望在程序代码中看到程序的逻辑,反射等绕过源代码的技术会带来维护问题,反射需要使用在正真正增加灵活性的地方
-
-
反射机制的应用
- 获取class类型对象的三种方式
-
forName(String className) 方法: 返回带有给定字符串名或接口相关联的class对象
// Class类型c1的内存地址指向堆中的对象,该对象代表employee.class整个类 Class c1=Class.forName("com.shige.day06.reflect.employee"); // 必须加包名
-
java.lang.Object.getClass() 方法: 返回此Object的运行时类。任何一个对象都有该方法(成员方法需引用)
employee e= new employee();
Class c2=e.getClass(); // c3为此 Objict 的运行时类。
-
java中每个类都有class属性,可直接赋值
Class c3 = employee.class; //c2 代表整个employee.class文件
// 第一种方式 Date类
Class c5=Class.forName("java.util.Date");
// 第二种方式 Date类
Class c4= Date.class;
// 第三种方式 Date类
Date d=new Date(); Class c6=d.getClass();