反射
耦合度
多个模块之间产生的关系
解析类
通过字节码对象获取实例对象的过程
Class类
代表类的类
创建对象本质就是一个具体类(一个类对应一个.class文件对应一个字节码对象)
创建的对象就是一个字节码对象
Field类
代表属性的类
创建对象本质就是一个具体的属性
Method类
代表方法的类
创建对象本质就是一个具体的方法
Constructor类
代表构造方法的类
创建对象本质就是一个具体的构造方法
获取字节码对象
1.数据类型.class
2.对象调用Object类里的getClass方法
3.通过Class.forName()把字符串内容解析成字节码对象
public class ClassDemo1 {
public static void main(String[] args) throws ClassNotFoundException {
//1.数据类型.class
//字符串字节码对象
/*Class<String> clz = String.class;
//集合字节码对象
Class<List> clz1 = List.class;
//数组的字节码对象
Class<int[]> clz2 = int[].class;
//int的字节码对象
Class<Integer> clz3 = int.class;*/
//2.对象调用getclass()方法返回字节码对象
// Class<String> clz = (Class<String>) "abc".getClass();
//3.通过forName方法把字符串内容解析成字节码对象
//保证字符串里的包名+类名没有问题
Class<String> clz = (Class<String>) Class.forName("java.lang.String");
System.out.println(clz);
}
}
获取实例对象
1.字节码对象调用newInstance()执行无参构造返回实例对象
2.Constructor类的对象调用newInstance(有参)给有参构造赋值并且执行返回实力对象
缺点
1.打破封装原则
2.跳过泛型类型检测
练习
实现clone方法