Class类

本文深入探讨了Java中的反射机制,包括Class类的特性,如类对象的创建、类的加载以及如何通过反射获取和修改类的属性。通过示例展示了Class.forName()、类名.class以及对象.getClass()等方法获取Class对象,并利用反射创建对象、访问字段。总结了静态加载和动态加载的区别,强调了反射在降低依赖性方面的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Class也是类,因此也继承Object类
2. Class类对象不是new出来的,而是系统创建的
3. 对于某个类的Class类对象,在内存中只有一份,因为类只加载一次
4.每个类的实例都会记得自己是由哪个 Class 实例所生成
5. 通过Class对象可以完整地得到一个类的完整结构,通过一系列API
6. Class对象是存放在堆的
7. 类的字节码二进制数据,是放在方法区的,有的地方称为类的元数据(包括 方法代码,
变量,访问权限等等)

package Reflection;

/**
 * @author whlie(true){learn}
 */
public class Car {
    public String brand="宝马";
    public int price=1000000;
    public String color="黑色";

    @Override
    public String toString() {
        return "Car{" +
                "brand='" + brand + '\'' +
                ", price=" + price +
                ", color='" + color + '\'' +
                '}';
    }
}
package Reflection;

import java.lang.reflect.Field;

/**
 * @author whlie(true){learn}
 */
public class Usual {
    public static void main(String[] args) throws Exception {
        String classAllPath="Reflection.Car";
        //1.获取Car对应的Class对象,<?>代表不确定的Java类型
        Class<?> cls = Class.forName(classAllPath);
        //2.输出cls
        //显示cls对象是那个类的class对象
        System.out.println(cls);
        //输出cls的运行类型
        System.out.println(cls.getClass());
        //3.得到包名
        System.out.println(cls.getPackage().getName());
        //4.得到全类名
        System.out.println(cls.getName());
        //5.通过cls创建对象实例
        Car car=(Car)cls.newInstance();
        System.out.println(car);
        //6.通过反射获取属性
        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());
        }
    }
}

获取Class类的方法

package Reflection;

/**
 * @author whlie(true){learn}
 */
public class Getclass {
    public static void main(String[] args) throws Exception {
        //1.Class.forName通过读取配置文件获取
        //前提:已知一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取
        //多用于配置文件,读取类全路径,加载类
        String classAllpath="Reflection.Car";
        Class<?> cls1 = Class.forName(classAllpath);
        System.out.println(cls1);
        //2.类名.class
        //前提:若已知具体的类,通过类的class 获取,该式最为安全可靠,性能最高
        //多用于参数传递,比如通过反射得到对应构造器对象.
        Class cls2=Car.class;
        System.out.println(cls2);
        //3.对象.getclass()
        //前提:已知某个类的实例,调用该实例的getclass方法获取Class对象
        //多用于创建好的对象获取Class对象
        Car car = new Car();
        Class cls3 = car.getClass();
        System.out.println(cls3);
        //4.通过类加载器来获取到类的Class对象
        //(1)先得到类加载器Car
        ClassLoader classLoader = car.getClass().getClassLoader();
        //(2)通过类加载器得到Class对象
        Class cls4 = classLoader.loadClass(classAllpath);
        System.out.println(cls4);
    }
}

静态加载:程序编译时就会加载,依赖性强

例如:创建对象(new)时,子类被加载时,调用类中的静态成员时

动态加载:当程序运行到的时候才会加载,降低了依赖性

例如:反射

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1while(true){learn}

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值