网站首页 > 博客文章 正文
这个反射其实算是一道初级升中级的面试题,也是初级必须了解,中级必须了解并熟练使用的知识技能。
接下来就开始聊聊吧。
什么是反射?
反射就是在程序运行状态中,对于任何一个类,都能通过特定的方式方法获取到这个类的属性和方法,并且可以对这些属性、方法进行调用。
说白了,反射就是在程序运行时获取和执行某个类属性或方法的功能。
反射具体能做些什么?
能做的事情主要分为以下几种。
我们默认先写好一个类:APP.java;
public class APP {
private Integer id;
private String username;
public String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String toString(){
System.out.print("toString");
}
private String toString_2(){
System.out.print("toString_2");
}
}
获取类
Class.forName(param)方法
param:指定类的全路径,比如:com.test.APP,代码如下:
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class aClass = Class.forName("com.test.APP");
APP app = (APP) aClass.newInstance();
}
这里的newInstance():实例化Class,生成对象,等同于new。
调用公共属性(public)
getField(param):获取指定的公共属性,param:指定的属性名称。
getFields():获取全部的公共属性,返回值Field[]数组。
代码如下:
public static void main(String[] args) {
try {
Class aClass = Class.forName("com.test.APP");
// APP app = (APP) aClass.newInstance();
Field password = aClass.getField("password");
//打印结果:public java.lang.String com.test.APP.password
System.out.println(password);
Field[] fields = aClass.getFields();
}catch (Exception e){
e.printStackTrace();
}
}
调用私有属性
getDeclaredField(param):获取指定的私有属性,param:指定的属性名称。
getDeclaredFields():获取全部的私有属性。
代码如下:
public static void main(String[] args) {
try {
Class aClass = Class.forName("com.test.APP");
Field username = aClass.getDeclaredField("username");
// 强制获得私有变量的访问权限
username.setAccessible(true);
//打印结果:public java.lang.String com.test.APP.username
System.out.println(username);
Field[] fields = aClass.getDeclaredFields();
}catch (Exception e){
e.printStackTrace();
}
}
这里还涉及到一个方法,就是setAccessible(true),其作用是获得访问权限,否则无法获取这个属性。
调用公共方法 (public)
getMethod(param):获取指定的公共方法,param:指定的方法名称
getMethods():获取全部公共方法
public static void main(String[] args) {
try {
Class aClass = Class.forName("com.test.APP");
Method method = aClass.getMethod("toString");
Method[] methods = aClass.getMethods();
//执行toString()方法
Object app = aClass.newInstance();
method.invoke(app);
}catch (Exception e){
e.printStackTrace();
}
}
这里还有一个知识点,就是如何执行获取到Method方法,在代码中也有体现,可以自行尝试一下。
调用私有方法
getDeclaredMethod(param):获取指定的私有方法,param:指定的私有方法名称。
getDeclaredMethods():获取全部的私有方法。
public static void main(String[] args) {
try {
Class aClass = Class.forName("com.test.APP");
Method method = aClass.getDeclaredMethod("toString_2");
method.setAccessible(true);
Method[] methods = aClass.getDeclaredMethods();
//执行toString()方法
Object app = aClass.newInstance();
method.invoke(app);
}catch (Exception e){
e.printStackTrace();
}
}
- 上一篇: Java程序员面试中容易被问哪些问题?
- 下一篇: 高频面试题-说清楚Spring如何解决循环依赖?
猜你喜欢
- 2025-01-14 C#面试宝典 2022年 60个常见的C#面试问题和答案
- 2025-01-14 宝藏!2024年RAG面试问题及答案 TOP30(下)
- 2025-01-14 40道 Redis 运维面试题(附答案)
- 2025-01-14 SpringBoot 整合 Quartz 实现 JAVA 定时任务的动态配置
- 2025-01-14 10个Python面试的高级问题
- 2025-01-14 「干货」 redis面试题
- 2025-01-14 关于Java 工程师面试,这几个点注意了,offer拿到手软
- 2025-01-14 Java程序员面试自我介绍部分讲什么?面试技巧
- 2025-01-14 这358道大厂经典面试前端面试题,你会多少?
- 2025-01-14 读完这46道Redis面试题之后,你就会觉得自己的Redis白学了
你 发表评论:
欢迎- 429℃用AI Agent治理微服务的复杂性问题|QCon
- 426℃手把手教程「JavaWeb」优雅的SpringMvc+Mybatis整合之路
- 406℃初次使用IntelliJ IDEA新建Maven项目
- 405℃Maven技术方案最全手册(mavena)
- 397℃IntelliJ IDEA 2018版本和2022版本创建 Maven 项目对比
- 396℃从头搭建 IntelliJ IDEA 环境(intellij idea建包)
- 395℃InfoQ 2024 年趋势报告:架构篇(infoq+2024+年趋势报告:架构篇分析)
- 386℃IT全明星|IntelliJ IDEA学习笔记(四、idea中怎么创建maven项目)
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)