目录
-
一、反射机制
-
二、获取Class对象的三种方式
- 1、Class.forName("全类名")
- 2、类名.class
- 3、对象.getClass()
- 三、反射相关的方法
-
四、Demo×2
- 1、尝试自己写一个clone()方法
- 2、利用配置文件动态加载
一、反射机制
1、概述
反射机制:将类的各个组成部分封装成其他对象,在运行状态中,可以动态获取类信息和调用类对象的方法。
2、优缺点
- 优点
- 可以在程序运行过程中,操作类的组成部分。
- 可以解耦,提高程序的可扩展性。
- 缺点
3、类加载的过程
java语言有着”一处编译,处处运行“的优良特点,能够很好地适应不同的平台,过程大致如下:
- 我们通过
javac 命令将.java 文件编译,会在磁盘上生成不面向平台的字节码文件.class 。
- 类加载器通过一系列的操作,如加载、连接和初始化之后,将
.class 文件加载进内存中。
- 将.class字节码文件代表的静态存储结构转化为方法区的运行时数据结构。
- 类加载时还会再内存中创建一个
java.lang.Class 的对象,该对象包含类的信息,作为程序从方法区访问各种数据的接口。
二、获取Class对象的三种方式
这个Class对象包含类的所有信息,也就是说,我们获得了这个Class类的对象,就可以访问到JVM中的这个类。那么,如何获取呢?主要有以下三种方式。
1、Class.forName("全类名")
通过Class的静态方法forName("全类名") ,返回和全类名对应类的Class对象。
//Class.forName("全类名");
Class cls1 = Class.forName("com.my.base.Person");
System.out.println(cls1);
- 多用于配置文件,将类名定义在配置文件中,便可以动态读取文件,加载类。
- 全类名指:完整包名.类名,如果找不到,会抛出ClassNotFoundException的异常。
2、类名.class
通过类名的class属性 获取,返回该类对应的Class对象。
//类名.class;
Class cls2 = Person.class;
System.out.println(cls2);
- 该方式在程序编译阶段就可以检查需要访问的Class对象是否存在,相对来说更加安全。
- 该方式无需调用方法,程序性能方面相对较好。
3、对象.getClass()
getClass() 方法在Object中定义,返回该对象所属类对应得Class对象。
//对象.getClass();
Person p = new Person();
Class cls3 = p.getClass();
System.out.println(cls3);
同一个字节码文件.class 在一次程序运行过程中,只会被加载一次,不论通过哪种方式获取的Class对象都是同一个。
// == 比较三个对象,都是true
System.out.println(cls1 == cls2);
System.out.println(cls1 == cls3);
System.out.println(cls3 == cls2);
三、反射相关的方法
Class对象包含着类的所有信息,而这些信息被封装在java.lang.reflect 包下,成了一个个的类,不完全统计如下:
Method |
Field |
Annotation |
Constructor |
Package |
Modifier |
Parameter |
|