Class类(个人笔记)

Class类:

 

1,Class也是类,因此也继承Object类;

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

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

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

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

6,Class 对象是存放在堆中的;

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

常用方法:(看代码及其注释)

Car类:

package com.hsp;

public class Car {
    public String brand = "五菱";//品牌
    public int price = 10000;
    public String coloe = "银灰色";

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

Class01:

package com.hsp.class_;

import com.hsp.Car;

import java.lang.reflect.Field;

public class Class01 {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {
        String classAllPath = "com.hsp.Car";
        //1 . 获取到 Car 类 对应的 Class 对象
//<?> 表示不确定的 Java 类型
        Class<?> cls = Class.forName(classAllPath);
//2. 输出 cls
        System.out.println(cls); //显示 cls 对象, 是哪个类的 Class 对象 com.hspedu.Car
        System.out.println(cls.getClass());//输出 cls 运行类型 java.lang.Class
//3. 得到包名
        System.out.println(cls.getPackage().getName());//包名
//4. 得到全类名
        System.out.println(cls.getName());
//5. 通过 cls 创建对象实例
        Car car = (Car) cls.newInstance();
        System.out.println(car);//car.toString()
//6. 通过反射获取属性 brand
        Field brand = cls.getField("brand");
        System.out.println(brand.get(car));//宝马
//7. 通过反射给属性赋值
        brand.set(car, "宏光");
        System.out.println(brand.get(car));//奔驰
//8 我希望大家可以得到所有的属性(字段)
        System.out.println("=======所有的字段属性====");
        Field[] fields = cls.getFields();
        for (Field f : fields) {
            System.out.println(f.getName());//名称
        }
    }
}

获取Class类对象:

一,在编译阶段用  Class.forName();

使用前提:已知一个类的全类名,并且该类在类路径下,可通过 Class 类的静态方法 forName()  获取,使用时可能会抛出 ClassFoundException 异常;

应用场景:多用户配置文件,读取类全路径,加载类。

二,加载阶段,用 类.class

使用前提:若已知具体的类,可通过类的 class 获取,该方法最为安全可靠,程序性能最高。

应用场景:多用于参数传递,比如通过反射得到对应构造器对象。

三,运行阶段,用 对象.getClass();

使用前提:已知某个类的实例,调用该实例的 getClass() 方法获取 Class对象。

应用场景:通过创建好的对象,获取Class对象。

四,其他方式

类加载器(有4种)

五,基本数据类型(int , char, boolean, float, double , byte ,long ,short

Class cls = 基本数据类型.class

六,基本数据类型对应的包装类:

Class cls = 包装类.TYPE

package com.hsp.class_;

import com.hsp.Car;

public class GetClass {
    public static void main(String[] args) throws ClassNotFoundException {
        //1,Class.forName
        String classAllPath = "com.hsp.Car";
        Class<?> cls1 = Class.forName(classAllPath);
        System.out.println(cls1);

        //2,类名.class,应用场景:用于参数传递
        Class cls2 = Car.class;
        System.out.println(cls2);

        //3,对象.getClass(),应用场景:有对象实例
        Car car = new Car();
        Class cls3 = car.getClass();
        System.out.println(cls3);

        //4,通过类加载器,类获取类的Class对象,类加载器有4种
        //①,先得到car的类加载器
        ClassLoader classLoader = car.getClass().getClassLoader();
        //②,通过类加载器得到Class对象
        Class cls4 = classLoader.loadClass(classAllPath);
        System.out.println(cls4);

        //cls1,cls2,cls3,cls4其实都是同一个对象
        System.out.println(cls1.hashCode());
        System.out.println(cls2.hashCode());
        System.out.println(cls3.hashCode());
        System.out.println(cls4.hashCode());

        //5,基本数据类型
        Class<Integer> integerClass = int.class;
        Class<Character> characterClass = char.class;
        System.out.println(integerClass);

        //6,基本数据类型对应的包装类
        Class<Integer> type = Integer.TYPE;
        Class<Character> type1 = Character.TYPE;
        System.out.println(type);
        
        System.out.println(integerClass.hashCode());
        System.out.println(type.hashCode());

    }
}

有Class对象的类型:

1,外部类,成员内部类,静态内部类,局部内部类,匿名内部类

2,interface:接口

3,数组

4,enum:枚举

5,annotation:注解

6,基本数据类型

7,void

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);
System.out.println(cls2);
System.out.println(cls3);
System.out.println(cls4);
System.out.println(cls5);
System.out.println(cls6);
System.out.println(cls7);
System.out.println(cls8);
System.out.println(cls9);

以上内容仅为个人学习笔记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值