spring第2天(反射)
反射:reflect
- 反射就是我们可以在程序运行的时候,利用API获取任何类的内部信息(包含私有的),并且还可以操作类中的属性和方法(包含私有的)
- 反射的核心:class对象(类对象)-->XXX.class文件
Class对象:
- 每个类都有Class对象(有且只有一个Class对象)
- 一个类被加载后,类的整个结构都会被封装到Class对象中,Class对象包含了类的结构,属性,方法等
- Class是反射的根源
一,如何创建Class对象
- Class.forName("类的完全限定名");
<?>相当于是任意类型
Class<?> ca=Class.forName("entity.User");
System.out.println(ca);//class entity.User
- XXX.class--->getMapper(UserMapper.class);
Class<?> ca2=User.class;
System.out.println(ca2);//class entity.User
- 通过new对象
User user=new User();
Class<?> ca3=user.getClass();
System.out.println(ca3);//class entity.User
二,通过Class对象获取类的相关信息
- getName():获取类的名字,包含类所在的包名
String name=ca.getName();
System.out.println(name);//entity.User
- getSimpleName():获取类的名字,但是不包含包名
name=ca.getSimpleName();
System.out.println(name);//User
- getModifiers():获取访问修饰符对应的数值
例如:1代表public
int a=ca.getModifiers();
System.out.println(a);
- Modifier.toString(int a):将访问修饰符对应的数值转换成相关字符串名
1转换成public
System.out.println(Modifier.toString(a));
- getSuperclass():获取父类
name= ca.getSuperclass().getName();
System.out.println(name);//java.lang.Object
三,通过Class对象来创建类对象
1. newInstance():默认会调用类中的无参构造
Class<?> ca=Class.forName("entity.User");
User user=(User)ca.newInstance();
System.out.println(user);//User [name=null, age=0]
2. 通过构造方法创建对象
.通过无参构造
Constructor<?> con= ca.getConstructor();
System.out.println(con);//public entity.User()
User user2=(User)con.newInstance();
System.out.println(user2);//User [name=null, age=0]
.通过有参构造
//通过有参构造
Constructor<?> con2= ca.getConstructor(String.class,int.class);
User user3=(User)con2.newInstance("张三",18);
System.out.println(user3);//User [name=张三, age=18]
3. 获取类中的属性
获取属性需要使用Field类型的变量或者数组接收
- getFields():获取类中公开(public)的属性,且能获取父类中公开(public)的属性
- getDeclaredFields():获取本类中的所有属性,包括私有的,但是不能获取父类的
- getField(String name):获取指定名字的属性
- getDeclaredField(String name):获取指定名字的属性
- set(obj, value):第一个参数表示要设置属性值的对象,第二个参数表示要设置的属性的值
- setAccessible(boolean flag):true:开启设置私有属性值的权限
Field[] fs=ca.getDeclaredFields();
System.out.println(Arrays.toString(fs));//[public java.lang.String entity.User.name]
//遍历所有属性,分别获取属性的名称,访问修饰符,以及类型
for (Field f : fs) {
//获取修饰符
System.out.println("获取到的属性名称:"+f.getName());//获取到的属性名称:name
//获取访问修饰符
System.out.println("获取到的属性访问修饰符:"+Modifier.toString(f.getModifiers()));//获取到的属性访问修饰符:public
//获取类型
System.out.println("获取到的属性类型:"+f.getType().getSimpleName());//获取到的属性类型:String
}
4. 获取类中的方法
- getMethods():获取所有公开的(public修饰)的方法,包括父类中的
- getDeclaredMethods():获取本类的所有方法,包括私有的
- getMethod(String name):获取指定名字的方法
- getDeclaredMethod(String name):
- getReturnType():获取方法的返回值类型
- getParameters():获取方法的参数列表
注意:要想知道具体的参数,需要向下面这样使用
Arrays.toString(m.getParameters())
- invoke(Object obj, Object...args):执行某个类中的指定方法
*第一个参数:要执行某个方法所在的类对象
*第二个参数/第3个参数... : 参数的值
*注意:该方法执行之后,会获取到所执行方法的返回值(如果没有返回值,则接收null) - setAccessible(boolean flag):true:开启设置调用私有方法的权限
Method[]mds= ca.getDeclaredMethods();
System.out.println(Arrays.toString(eatmds));
for (Method m : mds) {
//获取方法名
System.out.println("方法的名称"+m.getName());
System.out.println("方法的修饰符"+Modifier.toString(m.getModifiers()));
System.out.println("方法的返回值类型"+m.getReturnType().getSimpleName());
System.out.println("方法的参数列表是"+Arrays.toString(m.getParameters()));
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?