Java--反射--Class类分析

  1. 基本介绍:
    1. 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);
                   }
              * */
      
          }
      }
  2. Class应用实例:

    1. 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));
              }
      
          }
      }
  3. 获取Class类对象

    1.  

    2. 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());
      
          }
      
      }
  4. 那些类型有Class类对象 

    1.  

    2. 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);
          }
      } 
posted @ 2021-06-28 18:55  张紫韩  阅读(48)  评论(0编辑  收藏  举报