1、Class 类
1.1、基本介绍
package reflection.class_;
import reflection.Cat;
/**
* 对 Class 类特点的梳理
*/
@SuppressWarnings({"all"})
public class Class01 {
public static void main(String[] args) throws ClassNotFoundException {
// 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) 反射方式, 刚才没有 debug 到 ClassLoader 类的 loadClass, 原因是没有注销 Cat cat = new Cat();
/*
ClassLoader 类, 仍然是通过 ClassLoader 类加载 Cat 类的 Class 对象
public Class<?> loadClass(String name) throws ClassNotFoundException {
return loadClass(name, false);
}
*/
Class cls1 = Class.forName("reflection.Cat");
// 3. 对于某个类的 Class 类对象, 在内存中只有一份, 因为类只加载一次
Class cls2 = Class.forName("reflection.Cat");
System.out.println(cls1.hashCode()); // 1554874502
System.out.println(cls2.hashCode()); // 1554874502
Class cls3 = Class.forName("reflection.Dog");
System.out.println(cls3.hashCode()); // 1846274136
}
}
1.2、Class 类的常用方法
package reflection.class_;
import reflection.Car;
import java.lang.reflect.Field;
/**
* Class 类的常用方法
*/
@SuppressWarnings({"all"})
public class Class02 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, NoSuchFieldException {
String classAllPath = "reflection.Car";
// 1. 获取到 Car 类 对应的 Class 对象
// <?> 表示不确定的 Java 类型
Class<?> cls = Class.forName(classAllPath);
// 2. 输出 cls
System.out.println(cls); // 显示 cls 对象, 是哪个类的 Class 对象 reflection.Car
System.out.println(cls.getClass()); // 输出 cls 运行类型 java.lang.Clas
// 3. 获取包名
System.out.println(cls.getPackage().getName()); // reflection
// 4. 得到全类名
System.out.println(cls.getName()); // reflection.Car
// 5. 通过 cls 创建对象实例
Car car = (Car) cls.newInstance();
System.out.println(car); // reflection.Car@5cad8086
// 6. 通过反射获取属性 brand
Field brand = cls.getField("brand");
System.out.println(brand.get(car)); // 宝马
// 7. 通过反射给属性赋值
brand.set(car, "奔驰");
System.out.println(brand.get(car)); // 奔驰
// 8. 遍历所有的属性(字段)
Field[] fields = cls.getFields();
for (Field f : fields) {
System.out.println(f.getName()); // 名称
}
/*
brand
price
*/
}
}
1.3、获取 Class 类对象
package reflection.class_;
import reflection.Car;
/**
* 得到 Class 对象的各种方式(6种方式)
*/
@SuppressWarnings({"all"})
public class GetClass_ {
public static void main(String[] args) throws ClassNotFoundException {
// 1. Class.forName
String classAllPath = "reflection.Car"; // 通过读取配置文件获取
Class<?> cls1 = Class.forName(classAllPath);
System.out.println(cls1); // class reflection.Car
// 2. 类名.class, 应用场景: 用于参数传递
Class cls2 = Car.class;
System.out.println(cls2); // class reflection.Car
// 3. 对象.getClass(), 应用场景, 有对象实例
Car car = new Car();
Class cls3 = car.getClass();
System.out.println(cls3); // class reflection.Car
// 4. 通过类加载器[4 种]来获取到类的 Class 对象
// (1)先得到类加载器 car
ClassLoader classLoader = car.getClass().getClassLoader();
// (2)通过类加载器得到 Class 对象
Class cls4 = classLoader.loadClass(classAllPath);
System.out.println(cls4); // class reflection.Car
// cls1, cls2, cls3, cls4 其实是同一个对象
System.out.println(cls1.hashCode()); // 1554874502
System.out.println(cls2.hashCode()); // 1554874502
System.out.println(cls3.hashCode()); // 1554874502
System.out.println(cls4.hashCode()); // 1554874502
// 5. 基本数据(int, char, boolean, float, double, byte, long, short) 按如下方式得到 Class 类对象
Class<Integer> integerClass = int.class;
Class<Character> characterClass = char.class;
Class<Boolean> booleanClass = boolean.class;
System.out.println(integerClass); // int
// 6. 基本数据类型对应的包装类, 可以通过 .TYPE 得到 Class 类对象
Class<Integer> type1 = Integer.TYPE;
Class<Character> type2 = Character.TYPE; // 其它包装类 BOOLEAN, DOUBLE, LONG, BYTE 等
System.out.println(type1); // int
System.out.println(integerClass.hashCode()); // 1846274136
System.out.println(type1.hashCode()); // 1846274136
}
}
1.4、以下类型有 Class 对象
package reflection.class_;
import java.io.Serializable;
/**
* 哪些类型有 Class 对象
*/
@SuppressWarnings({"all"})
public class AllTypeClass {
public static void main(String[] args) {
Class<String> cls1 = String.class; // 外部类
Class<Serializable> cls2 = Serializable.class; // 接口
Class<Integer[]> cls3 = Integer[].class; // 数组
Class<float[][]> cls4 = float[][].class; // 二维数组
Class<Deprecated> cls5 = Deprecated.class; // 注解
// 枚举
Class<Thread.State> cls6 = Thread.State.class;
Class<Long> cls7 = long.class; // 基本数据类型
Class<Void> cls8 = void.class; // void 数据类型
Class<Class> cls9 = Class.class;
System.out.println(cls1); // class java.lang.String
System.out.println(cls2); // interface java.io.Serializable
System.out.println(cls3); // class [Ljava.lang.Integer;
System.out.println(cls4); // class [[F
System.out.println(cls5); // interface java.lang.Deprecated
System.out.println(cls6); // class java.lang.Thread$State
System.out.println(cls7); // long
System.out.println(cls8); // void
System.out.println(cls9); // class java.lang.Class
}
}