一篇文章弄懂 Java 反射的使用,成功定级腾讯T3-2

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public void show(){

System.out.println(“name=” + this.name + " age=" + this.age);

}

}

上面的代码很简单,应该都能看懂,我们以这个Student类来实验

https://blog.51cto.com/u_11436461/2882250

回到上面的问题:如何使用这个类? ,代码如下:

//1 创建一个对象

Student s = new Student();

//2 调用对象的方法

s.setName(“李雷”);

s.setAge(23);

//3 打印一下

s.show();

打印的结果下:

name=李雷 age=23

上面就是和 反射 相反的通过正常的方式创建一个类的对象,然后通过对象调用类的方法

其实我们还可以根据类的字节码来创建对象,然后调用类的方法

也就是通过某个类的 Class ,来创建对象,然后调用类的方法

2. 如何获取类的 Class 呢?


3个方法,以Student为例,演示如下:

第一种:通过 Class.forName(“com.model.Student”) 来获取Student的 Class

代码如下:

Class cls = Class.forName(“com.model.Student”);

第二种:通过 Student.class

Class cls = Student.class

第三种:通过类的对象来获取,调用类的对象的 getClass()方法

Student s = new Student();

Class cls = s.getClass()

以上就是三种方法获取一个类的 Class 的方法,必须要牢记,尤其是前 2 个,用的最多

3. 如何通过Class来创建对象,进而来调用类的方法或者属性呢?


  • 第一步:获取类的 Class 对象

  • 第二步:获取对应的方法的字节码 Method 以及 构造函数的字节码 Constructor ,或者字段的字节码 Field

  • 第三步:通过Constructor的 newInstance()方法生成一个类的对象

  • 第四步:通过调用 Method的 invoke()方法完成调用类的代码

代码演示如下:

//第一步:获取Student的 Class 对象,即Student的字节码

Class cls = Class.forName(“com.model.Student”);

//第二步:获取无参的构造方法的字节码,当然也可以获取有参的

Constructor constructor = cls.getConstructor();

//第三步:调用构造函数的字节码对象的 newInstance 方法创建 Student的对象 obj

Object obj = constructor.newInstance();

//第四步:获取 setName 方法的字节码,注意参数传方法的名字以及方法中参数的字节码

// 获取了setName的字节码 method,调用方法必须要有一个对象,所以上面的obj对象就是用来此处的

// 一定要传进行

Method method = cls.getMethod(“setName”, String.class);

method.invoke(obj,“待兔”);

//和上面类似,只不过这次 getMethod 的第二个参数传的是 int.class

//因为第二个参数是int类型

Method method1 = cls.getMethod(“setAge”, int.class);

method1.invoke(obj,23);

//和上面类似 ,只不过 show()方法是无参的,所以 getMethod 只需要传方法的名字"show" 即可

Method showMethod = cls.getMethod(“show”);

//最后:调用showMethod方法,通过调用showMethod的invoke方法,里面传入前面创建的obj对象

//就达到了调用对象的show方法

showMethod.invoke(obj);

通过上面的代码演示可以看出,在不知道 Student 类型的情况下,我们只需要知道 Student类的全类名(包名+类名)

也就是com.model.Student ,就可以获取到 Student类的

和直接通过 Student s = new Student(); s.show(); 这种方法不一样的是,上面是在运行时通过字符串值知道要运行的类是com.model.Student

所以,反射就是在运行的时候 ,才知道这个类是什么,并且可以在运行的时候 ,获取这个类的完整信息,并调用对应的方法

4. 常用的反射API


4.1 在反射中,要获取一个类或调用一个类的方法,我们首先需要获取到该类的 Class 对象

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

最后

做任何事情都要用心,要非常关注细节。看起来不起眼的、繁琐的工作做透了会有意想不到的价值。
当然要想成为一个技术大牛也需要一定的思想格局,思想决定未来你要往哪个方向去走, 建议多看一些人生规划方面的书籍,多学习名人的思想格局,未来你的路会走的更远。

更多的技术点思维导图我已经做了一个整理,涵盖了当下互联网最流行99%的技术点,在这里我将这份导图分享出来,以及为金九银十准备的一整套面试体系,上到集合,下到分布式微服务

划方面的书籍,多学习名人的思想格局,未来你的路会走的更远。

更多的技术点思维导图我已经做了一个整理,涵盖了当下互联网最流行99%的技术点,在这里我将这份导图分享出来,以及为金九银十准备的一整套面试体系,上到集合,下到分布式微服务

[外链图片转存中…(img-guBfK7eJ-1711165668897)]

[外链图片转存中…(img-YWTdo1PL-1711165668897)]

[外链图片转存中…(img-DuFKEcPM-1711165668898)]

[外链图片转存中…(img-9xpdcOGg-1711165668898)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值