反射Class对象的获取方式

文章介绍了Java反射机制的核心概念,包括通过对象、类名或Class.forName获取Class对象的方式,以及如何通过反射创建对象、访问构造器。同时提到了基本数据类型的Class对象及其对应的TYPE属性。

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

目录

一、反射(Reflect)

二、Class对象的获取方式

(1)通过对象类获取字节码

(2)如果有类名称,通过 类名称.class 获取

(3)Class.forName("类名全路径").var (用的最多)

三、基本数据类型的Class对象


一、反射(Reflect)

反射:是一种java提供的专门技术,该技术主要通过字节码文件实现对相关Java类进行各种操作(把Java中的各个组成部分映射成相应的Java类。),反射是一种非常强大的技术,广泛应用在框架中(mybatis、spring全家桶)。

一个类的组成部分包括:属性、方法、构造方法、包等。

        Class类定义了一系列的方法来获取Java类的属性、方法、构造方法、包等信息,这些信息都有相应的类来表示,分别是Field、Method、Constructor、Package等。

注意:表示Java类的组成部分的各种类位于java.lang.reflect包里。

二、Class对象的获取方式

Class类的对象就是不同的类对应的字节码。

通过反射创建对象:

字节码对象.newInstance();     //该方法相当于直接反射无参的构造(包括私有的)

通过反射获取构造器(函数)   :   DeclaredXXX表示获取该类的自定义成员,没有Declared的表示获取所有的能够访问到的成员(包括父类的)

字节码对象.getDeclaredConstructor()   

字节码对象.getDeclaredConstructors()   

字节码对象.getConstructors()   

获取Class对象一般有三种方式:

(1)通过对象类获取字节码

对象名.getClass(),是Object类的方法

 Person p1  = new Person(); 

     p1.getClass();

@Test
    public void test02(){
        User user = new User();
        Class< User> clazz = (Class<User>) user.getClass();


        //获取User对象的构造函数
        Constructor<?>[] constructors = clazz.getConstructors();
        for (int i = 0; i < constructors.length; i++) {
            Constructor<?> constructor = constructors[i];
            System.out.println(constructor);
        }

        try {
            Constructor<User> constructor = clazz.getConstructor(Integer.class ,String.class);
            User user1 = constructor.newInstance(1, "张三");
            System.out.println(user1);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }


    }
(2)如果有类名称,通过 类名称.class 获取
 @Test
    public void test() throws IllegalAccessException, InstantiationException {

        Class<User> userClass = User.class;
        User user = userClass.newInstance();

        user.setName("张三");
        user.setAge(18);
        user.setId(123456);
        user.setAddress("上海");

        System.out.println(user);

    }
(3)Class.forName("类名全路径").var (用的最多)

  Class.forName("java.lang.String");

对象是类创建的,同一个类的不同对象具有不同的属性值。

Java中定义的所有类都属于同一种事物,可以用Class来表示。

@Test
    public void test03(){
        try {
            //这里必须是类的全包名
            Class<?> clazz = Class.forName("com.zh.javase.User");
            Constructor<?> constructor = clazz.getConstructor();
            User user = (User) constructor.newInstance();
            user.setName("张三");
            user.setAge(18);
            user.setId(123456);
            user.setAddress("上海");

            System.out.println(user);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

    }

获取无参构造方法-----Void.class

Modifier类中有所有关键字对应的值

三、基本数据类型的Class对象

8个基本数据类型:int、boolean、short、byte、char、long、float、double

它们有各自的Class对象

eg:int.class

        void.class

基本数据类型对应的封装类有属性TYPE,这个属性代表了封装了 封装类 所封装的基本数据类型的 Class对象。

int.class===Integer.TYPE

void.class===Void.TYPE

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

simpleHan

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

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

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

打赏作者

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

抵扣说明:

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

余额充值