反射
前言#
在 java 开发中有一个非常重要的概念就是java反射机制,也是java的重要特征之一。其主要是指程序可以访问、检测和修改它本身状态或行为的一种能力,通过反射可以调用私有方法和私有属性,大部分框架也都是运用反射原理的。 java 通常是先有类再有对象,有对象就可以调用方法或者属性, java 中的反射其实是通过 Class 对象来调用类里面的方法
反射可实现的功能#
一个类有多个组成部分,例如:成员变量、方法、构造方法等,反射就是加载类,并解剖出类的各个组成部分。反射主要提供以下功能:
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法
- 生成动态代理
Class类#
在检查一个类之前,必须先获取其 Class 对象。通过获取 Class 对象,可将一个类的方法、变量、接口、类名、类修饰符等信息告诉运行的程序
获取 Class 有三种方式:
Class.forName("完整包名带类名")
对象.getClass()
任何类型.class
相关 api#
获取完整的包名和类名#
public class reflectTest {
public static void main(String[] args) throws Exception {
Class<User> userClass = User.class;
String name = userClass.getName();
System.out.println(name);
}
}
获取父类与实现的接口#
public class reflectTest {
public static void main(String[] args) throws Exception {
Class<User> clazz = User.class;
// 获取父类
Class<?> parentClass = clazz.getSuperclass();
System.out.println(parentClass.getName());
// 获取接口
Class<?>[] interfaces = clazz.getInterfaces();
for (Class c : interfaces){
System.out.println(c.getName());
}
}
}
通过反射机制实例化对象#
public class reflectTest {
public static void main(String[] args) throws Exception {
Class<User> clazz = User.class;
// 通过默认构造方法构造,通过setter赋值
// User user = clazz.newInstance();
// user.setUserName("tom");
// user.setPassword("123456");
// System.out.println(user);
// 通过构造函数赋值,前提是得知道构造函数参数个数与类型,以及在构造函数数组的索引
Constructor<?>[] constructors = clazz.getConstructors();
// 索引0:无参
// 索引1:全参
Object user = constructors[1].newInstance("tom", "123");
System.out.println(user);
}
}
获取属性名、类型、访问修饰符#
public class reflectTest {
public static void main(String[] args) throws Exception {
Class<User> clazz = User.class;
Field[] declaredFields = clazz.getDeclaredFields();
for (Field f : declaredFields) {
// 访问修饰符
int modifiers = f.getModifiers();
String modifierType = Modifier.toString(modifiers);
// 类型
Class<?> type = f.getType();
System.out.println(f.getName() + "---" +type.getName() + "---" + modifierType);
}
}
}
获取某个类的全部方法#
public class reflectTest {
public static void main(String[] args) throws Exception {
Class<User> clazz = User.class;
Method[] methods = clazz.getMethods();
}
}
通过 for 循环获得每个方法的 Method 对象后,可以通过getModifiers
获取访问修饰符,通过getReturnType
获取返回值类型,通过getParameterTypes
获取参数类型,
通过getName
获取方法名,通过getExceptionTypes
获取可抛出异常类型
通过反射机制调用某个类的方法#
public class reflectTest {
public static void main(String[] args) throws Exception {
Class<User> clazz = User.class;
// 参数1为方法名
Method method = clazz.getMethod("saySomething", String.class);
// 参数2为方法要求参数
method.invoke(clazz.newInstance(),"hello");
}
}
通过反射机制操作某个类的属性#
public class reflectTest {
public static void main(String[] args) throws Exception {
Class<User> clazz = User.class;
User user = clazz.newInstance();
Field userNameField = clazz.getDeclaredField("userName");
// 如果操作private属性需要设置为true
userNameField.setAccessible(true);
userNameField.set(user,"tom");
System.out.println(user);
}
}
参考内容
java反射机制深入理解剖析
作者:colee51666
出处:https://www.cnblogs.com/colee51666/p/16467283.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
尊重每一个原创,从你我开始!
转载请注明原文链接,如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“👍”哦,博主在此感谢你的支持!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端