Class 类分析
-
Class
也是类,因此也继承Object
类
-
Class
类对象不是new
出来的,而是系统创建的 -
对于某个类的
Class
类对象,在内存中只有一份,因为类只加载一次 -
每个类的实例都会记得自己是由哪个
Class
实例所生成 -
通过
Class
可以完整地得到一个类的完整结构,通过一系列API
-
Class
对象是存放在堆的 -
类的字节码二进制数据,是放在方法区的,有的地方称为类的元数据(包括方法代码,变量名,方法名,访问权限等等)
package reflection_;
/**
* @Author: Gin
* @Description:
* @Modified By: Gin
* @Date: Created in 15:36 2021/9/28
*/
public class Reflection03 {
public static void main(String[] args) throws Exception {
// 1. Class 也是类,因此也继承 Object 类
// Class
// 2. Class 类对象不是 new 出来的,而是系统创建的
// (1) 传统 new 对象
/*
ClassLoader 类
public Class<?> loadClass(String name) throws ClassNotFoundException {
return loadClass(name, false);
}
*/
Cat cat = new Cat();
// (2) 反射方式,要测试反射的类加载,要先注释掉上面的 Cat cat = new Cat()
/*
ClassLoader 类,通过 ClassLoader 类加载 Cat 的 Class 对象
public Class<?> loadClass(String name) throws ClassNotFoundException {
return loadClass(name, false);
}
*/
Class aClass = Class.forName("reflection_.Cat");
// 3. 对于某个类的 Class 类对象,在内存中只有一份,因为类只加载一次
Class aClass1 = Class.forName("reflection_.Cat");
System.out.println(aClass.hashCode()); // 1349393271
System.out.println(aClass1.hashCode()); // 1349393271
Class aClass2 = Class.forName("reflection_.Dog");
System.out.println(aClass2.hashCode()); // 1338668845
}
}
Class 类常用方法
package reflection_;
import java.lang.reflect.Field;
/**
* @Author: Gin
* @Description:
* @Modified By: Gin
* @Date: Created in 16:23 2021/9/28
*/
public class Reflection04 {
public static void main(String[] args) throws Exception {
String classAllPath = "reflection_.Car";
// 1. 获取到 Car 类对应的 Class 对象
// <?> 表示不确定的 Java 类型,可以省略
Class<?> cls = Class.forName(classAllPath);
// 2. 输出 cls
System.out.println(cls); // 输出 cls 对象是哪个类的 Class 对象 ==> class reflection_.Car
System.out.println(cls.getClass()); // 输出 cls 运行类型 ==> class java.lang.Class
// 3. 得到包名
System.out.println(cls.getPackage().getName()); // 输出 cls 对象对应的 类 的包名 ==> reflection_
// 4. 得到全类名
System.out.println(cls.getName()); // reflection_.Car
// 5. 通过 cls 创建对象实例
// Object o = cls.newInstance(); 可以进行转型
Car car = (Car)cls.newInstance();
System.out.println(car);
// 6. 通过反射获取属性 brand
// TODO 不能获取私有属性,如何解决?
Field brand = cls.getField("brand");
System.out.println(brand.get(car)); // Porsche
// 7. 通过反射给属性赋值
brand.set(car, "BMW");
System.out.println(brand.get(car)); // BMW
// 8. 得到所有的属性
System.out.println("======所有属性======");
Field[] fields = cls.getFields();
for (Field field : fields) {
// 属性名
System.out.print(field.getName() + " = ");
// 属性值
System.out.println(field.get(car));
}
}
}