反射——Class类分析及常用方法

Class 类分析

  1. Class 也是类,因此也继承 Object
    在这里插入图片描述

  2. Class 类对象不是 new 出来的,而是系统创建的

  3. 对于某个类的 Class 类对象,在内存中只有一份,因为类只加载一次

  4. 每个类的实例都会记得自己是由哪个 Class 实例所生成

  5. 通过 Class 可以完整地得到一个类的完整结构,通过一系列 API

  6. Class 对象是存放在堆的

  7. 类的字节码二进制数据,是放在方法区的,有的地方称为类的元数据(包括方法代码,变量名,方法名,访问权限等等)



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));
        }


    }
}


在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值