Java--反射--Class类分析
- 基本介绍:
-
package com.model.Class; import com.model.reflection.Cat; /** *@Description:测试类 *@Author: 张紫韩 *@Crete 2021/6/28 16:56 * * 介绍Class类的特点 */public class classDemo01 { /** * 创建某个类的实例对象是都会创建这个类的 Class类对象, * 且只创建一个Class类对象,如果使用 new 创建了就不会在反射阶段创建了 * * * */ public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException { //传统的方法创建实例对象过程中,会创建一个 class类对象 Cat cat = new Cat(); /* 通过Class类 的loadClass方法创建了Cat类的Class类对象 public Class<?> loadClass(String name) throws ClassNotFoundException { return loadClass(name, false); } * */ Class<?> aClass = Class.forName("com.model.reflection.Cat"); //得到Class类对象,存放于堆中 Object o = aClass.newInstance(); //得到实例对象 //反射机制创建类的实例对象过程中,也同样是使用了Class类的loadClass方法加载Cat类的Class类对象 /* 通过Class类 的loadClass方法创建了Cat类的Class类对象 public Class<?> loadClass(String name) throws ClassNotFoundException { return loadClass(name, false); } * */ } }
-
Class应用实例:
-
package com.model.Class; import java.lang.reflect.Field; /** * @Description:测试类 * @Author: 张紫韩 * @Crete 2021/6/28 17:40 * * 演示Class类的常用方法 */ public class ClassDemo02 { public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException { String classFullPath="com.model.Class.Car"; // 1.获取Car的类对象 Class<?> aClass = Class.forName(classFullPath); // 2.输出类对象 System.out.println(aClass); //显示aClass对象,是哪个类的的Class对象:com.model.Class.Car System.out.println(aClass.getClass()); //显示aClass的运行类型 java.lang.Class // 3.得到包名 System.out.println(aClass.getPackage().getName()); // 4.全类名 System.out.println(aClass.getName()); // 5.实例对象 Object o = aClass.newInstance(); Car car= (Car) o; System.out.println(car); // 6.得到属性 Field brand = aClass.getField("brand"); brand.set(car, "奔驰"); System.out.println(brand.get(o)); // 7.拿到所有的字段属性 Field[] fields = aClass.getFields(); for (int i = 0; i < fields.length; i++) { System.out.println(fields[i].get(o)); } for (Field f:fields){ System.out.println(f.get(o)); } } }
-
获取Class类对象
-
-
package com.model.Class; /** * @Description:测试类 * @Author: 张紫韩 * @Crete 2021/6/28 20:57 * * 演示不同的阶段获取Class类对象 */ public class ClassDemo03 { public static void main(String[] args) throws ClassNotFoundException { // 1.处于编译阶段 String classFullPath="com.model.Class.Car"; Class<?> aClass1 = Class.forName(classFullPath);//通过读取配置文件得到类的全路径 System.out.println(aClass1); // 2.通过 类名.class ,应用场景:多用于参数传递 Class<Car> aClass2 = Car.class; System.out.println(aClass2); // 3.通过 对象名.getClass() 得到类对象 Car car = new Car(); Class<? extends Car> aClass3 = car.getClass(); System.out.println(aClass3); // 4.通过类加载器(4钟)得到类的Class类对象 // (1)先得到类的加载器 通过:car.getClass().getClassLoader(); ClassLoader classLoader = car.getClass().getClassLoader(); // (2)通过类加载器得到Class类对象 Class<?> aClass4 = classLoader.loadClass(classFullPath); System.out.println(aClass4); /** * aClass1 * aClass2 * aClass3 * aClass4 * 是同一个对象,只能有一个Class类对象 * * */ System.out.println(aClass1.hashCode()); System.out.println(aClass2.hashCode()); System.out.println(aClass3.hashCode()); System.out.println(aClass4.hashCode()); // 5.基本数据类型按如下的方式得到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> integerClass1 = Integer.TYPE; Class<Character> characterClass1 = Character.TYPE; //int类型和Integer类型的Class类对象是同一个 System.out.println(integerClass1.hashCode()+""+integerClass.hashCode()); System.out.println(characterClass1.hashCode()+""+characterClass.hashCode()); } }
-
那些类型有Class类对象
-
-
package com.model.Class; import java.io.Serializable; /** * @Description:测试类 * @Author: 张紫韩 * @Crete 2021/6/28 21:32 * * 演示有那些类型有Class类对象 */ public class ClassDemo04 { public static void main(String[] args) { // 1.外部类 Class<String> stringClass = String.class; System.out.println(stringClass); // 2.接口 Class<Serializable> serializableClass = Serializable.class; System.out.println(serializableClass); // 3.数组 Class<Integer[]> aClass1 = Integer[].class; //一维数组的Class类对象 Class<Integer[][]> aClass2 = Integer[][].class;//二维数组的Class类对象 System.out.println(aClass1); System.out.println(aClass2); // 4.注解的Class类对象 Class<Deprecated> deprecatedClass = Deprecated.class; System.out.println(deprecatedClass); // 5.枚举的Class类对象 Class<Thread.State> stateClass = Thread.State.class; System.out.println(stateClass); // 6.基本数据类型的Class类对象 Class<Long> longClass = long.class; System.out.println(longClass); // 7.包装类的Class类对象 Class<Integer> integerClass = Integer.class; System.out.println(integerClass); // 8.Void的Class类对象 Class<Void> voidClass = Void.class; System.out.println(voidClass); // 9.Class类的Class类对象 Class<Class> classClass = Class.class; System.out.println(classClass); } }
-