反射的概述以及获取字节码Class对象的三种方式
什么是反射:
反射是一种行为,发生在程序运行时,当你查看程序集数据或者元数据的时候
反射机制:是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,是一种动态获取的信息以及动态调用对象的方法的功能。
反射有什么用:
可以通过反射获取类中的方法、字段、属性、子类
什么时候用到反射:
简单的说反射是为了动态地运行时加载,而静态代码是在编译时就确定好了。也就是说当你的程序需要在运行时再做一些晚绑定,动态加载或检查对象等操作时,你就需要用到反射。
反射(Reflection)有下列用途:
- 它允许在运行时查看属性(attribute)信息。
- 它允许审查集合中的各种类型,以及实例化这些类型。
- 它允许延迟绑定的方法和属性(property)。
- 它允许在运行时创建新类型,然后使用这些类型执行一些任务
反射的优点和缺点:
优点:提高程序的灵活性与可扩展性,降低代码的耦合性
缺点:
1. 过多使用,会造成逻辑模糊,因为反射已经绕过的源码,看不到逻辑实现,会造成后期维护上的困扰。
2. 性能的问题,主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。
反射:框架设计的灵魂
框架:半成品软件,可以在框架的基础上进行软件开发,简化编码
反射:将类的各个组成部分封装成其他对象,这就是反射机制
好处:
1.可以在程序运行中,操作这些对象
2.可以解耦,提高程序的可扩展性。

获取字节码Class对象的三种方式
1、Class.forName("全类名"):将字节码文件加载进内存,返回Class对象
多用于配置文件,将类名定义在配置文件中。读取文件,加载类
2、类名.class:通过类名的属性class获取
多用于参数的传递
3、对象.getClass():getClass()方法在Object类中定义着。
多用于对象的获取字节码的方式
/* 反射 获取字节码Class对象的三种方式: 获取class对象的方式: 1.Class.forName("全类名"):将字节码文件加载进内存,返回Class对象 2.类名.class:通过类名的属性class获取 3.对象.getclass():getClass()方法在object类中定义着 结论: 同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个 */ public class demo01 { public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException { //1.Class.forName("全类名"):将字节码文件加载进内存,返回Class对象 Class<?> cls = Class.forName("com.abstract_01.denG_016.DenG_01.Person"); System.out.println(cls); //2.类名.class Class<Person> cls2 = Person.class; System.out.println(cls2); //3.对象.getClass() Person p = new Person(); Class<? extends Person> cls3 = p.getClass(); System.out.println(cls3); //==比较三个对象 System.out.println(cls==cls2); System.out.println(cls==cls3); } }
运行结果:


浙公网安备 33010602011771号