Java面向对象之 Class 类相关

Java面向对象之 Class 类相关,第1张

Java面向对象之 Class 类相关

文章目录

1、Class 类

1.1、基本介绍1.2、Class 类的常用方法1.3、获取 Class 类对象1.4、以下类型有 Class 对象

1、Class 类 1.1、基本介绍


package reflection.class_;

import reflection.Cat;


@SuppressWarnings({"all"})
public class Class01 {
    public static void main(String[] args) throws ClassNotFoundException {
        // 1. Class 也是类, 因此也继承 Object 类
        // Class
        // 2. Class 类对象不是 new 出来的, 而是系统创建的
        // (1) 传统 new 对象
        
        // Cat cat = new Cat();

        // (2) 反射方式, 刚才没有 debug 到 ClassLoader 类的 loadClass, 原因是没有注销 Cat cat = new Cat();
        
        Class cls1 = Class.forName("reflection.Cat");

        // 3. 对于某个类的 Class 类对象, 在内存中只有一份, 因为类只加载一次
        Class cls2 = Class.forName("reflection.Cat");
        System.out.println(cls1.hashCode());  // 1554874502
        System.out.println(cls2.hashCode());  // 1554874502
        Class cls3 = Class.forName("reflection.Dog");
        System.out.println(cls3.hashCode());  // 1846274136
    }
}
1.2、Class 类的常用方法

package reflection.class_;

import reflection.Car;

import java.lang.reflect.Field;


@SuppressWarnings({"all"})
public class Class02 {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, NoSuchFieldException {
        String classAllPath = "reflection.Car";
        // 1. 获取到 Car 类 对应的 Class 对象
        //  表示不确定的 Java 类型
        Class cls = Class.forName(classAllPath);
        // 2. 输出 cls
        System.out.println(cls);  // 显示 cls 对象, 是哪个类的 Class 对象 reflection.Car
        System.out.println(cls.getClass());  // 输出 cls 运行类型 java.lang.Clas
        // 3. 获取包名
        System.out.println(cls.getPackage().getName());  // reflection
        // 4. 得到全类名
        System.out.println(cls.getName());  // reflection.Car
        // 5. 通过 cls 创建对象实例
        Car car = (Car) cls.newInstance();
        System.out.println(car);  // reflection.Car@5cad8086
        // 6. 通过反射获取属性 brand
        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());  // 名称
        }
        
    }
}
1.3、获取 Class 类对象



package reflection.class_;

import reflection.Car;


@SuppressWarnings({"all"})
public class GetClass_ {
    public static void main(String[] args) throws ClassNotFoundException {
        // 1. Class.forName
        String classAllPath = "reflection.Car";  // 通过读取配置文件获取
        Class cls1 = Class.forName(classAllPath);
        System.out.println(cls1);  // class reflection.Car

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

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

        // 4. 通过类加载器[4 种]来获取到类的 Class 对象
        // (1)先得到类加载器 car
        ClassLoader classLoader = car.getClass().getClassLoader();
        // (2)通过类加载器得到 Class 对象
        Class cls4 = classLoader.loadClass(classAllPath);
        System.out.println(cls4);  // class reflection.Car

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

        // 5. 基本数据(int, char, boolean, float, double, byte, long, short) 按如下方式得到 Class 类对象
        Class integerClass = int.class;
        Class characterClass = char.class;
        Class booleanClass = boolean.class;
        System.out.println(integerClass);  // int

        // 6. 基本数据类型对应的包装类, 可以通过 .TYPE 得到 Class 类对象
        Class type1 = Integer.TYPE;
        Class type2 = Character.TYPE;  // 其它包装类 BOOLEAN, DOUBLE, LONG, BYTE 等
        System.out.println(type1);  // int
        System.out.println(integerClass.hashCode());  // 1846274136
        System.out.println(type1.hashCode());  // 1846274136
    }
}
1.4、以下类型有 Class 对象

package reflection.class_;

import java.io.Serializable;


@SuppressWarnings({"all"})
public class AllTypeClass {
    public static void main(String[] args) {
        Class cls1 = String.class;  // 外部类
        Class cls2 = Serializable.class;  // 接口
        Class cls3 = Integer[].class;  // 数组
        Class cls4 = float[][].class;  // 二维数组
        Class cls5 = Deprecated.class;  // 注解
        // 枚举
        Class cls6 = Thread.State.class;
        Class cls7 = long.class;  // 基本数据类型
        Class cls8 = void.class;  // void 数据类型
        Class cls9 = Class.class;

        System.out.println(cls1);  // class java.lang.String
        System.out.println(cls2);  // interface java.io.Serializable
        System.out.println(cls3);  // class [Ljava.lang.Integer;
        System.out.println(cls4);  // class [[F
        System.out.println(cls5);  // interface java.lang.Deprecated
        System.out.println(cls6);  // class java.lang.Thread$State
        System.out.println(cls7);  // long
        System.out.println(cls8);  // void
        System.out.println(cls9);  // class java.lang.Class
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5707572.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存