spring第2天(反射)

反射:reflect

  • 反射就是我们可以在程序运行的时候,利用API获取任何类的内部信息(包含私有的),并且还可以操作类中的属性和方法(包含私有的)
  • 反射的核心:class对象(类对象)-->XXX.class文件

Class对象:

  1. 每个类都有Class对象(有且只有一个Class对象)
  2. 一个类被加载后,类的整个结构都会被封装到Class对象中,Class对象包含了类的结构,属性,方法等
  3. Class是反射的根源
    image

一,如何创建Class对象

  1. Class.forName("类的完全限定名");
<?>相当于是任意类型
Class<?> ca=Class.forName("entity.User");
System.out.println(ca);//class entity.User

  1. XXX.class--->getMapper(UserMapper.class);
Class<?> ca2=User.class;
System.out.println(ca2);//class entity.User
  1. 通过new对象
User user=new User();
Class<?> ca3=user.getClass();
System.out.println(ca3);//class entity.User

二,通过Class对象获取类的相关信息

  1. getName():获取类的名字,包含类所在的包名
String name=ca.getName();
System.out.println(name);//entity.User
  1. getSimpleName():获取类的名字,但是不包含包名
name=ca.getSimpleName();
System.out.println(name);//User
  1. getModifiers():获取访问修饰符对应的数值
    例如:1代表public
    image
int a=ca.getModifiers();
System.out.println(a);
  1. Modifier.toString(int a):将访问修饰符对应的数值转换成相关字符串名
1转换成public
System.out.println(Modifier.toString(a));
  1. 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()));
}
posted @   不再犹豫27  阅读(30)  评论(0编辑  收藏  举报
编辑推荐:
· .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 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示