高频面试题-请讲一下Java的反射机制!
这是我参与更文挑战的第8天,活动详情查看: 更文挑战
这个反射其实算是一道初级升中级的面试题,也是初级必须了解,中级必须了解并熟练使用的知识技能。
接下来就开始聊聊吧。
什么是反射?
反射就是在程序运行状态中,对于任何一个类,都能通过特定的方式方法获取到这个类的属性和方法,并且可以对这些属性、方法进行调用。
说白了,反射就是在程序运行时获取和执行某个类属性或方法的功能。
反射具体能做些什么?
能做的事情主要分为以下几种。
我们默认先写好一个类:APP.java;
```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,代码如下:
```java 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[]数组。
代码如下:
```java 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():获取全部的私有属性。
代码如下:
```java 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():获取全部公共方法
```java
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():获取全部的私有方法。
```java 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();
}
}
```
今天一个根本没教过我的初中老师竟然加我微信,咨询我这个行业如何,字里行间透露出想走后门给他儿子找工作,一问啥也不会,替他发愁,祝前程似锦。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤