Java反射
通过反射的方法设计应用程序,提高更好的扩展性。
获取字节码文件对象的方式:
1. 通过Object类中的getClass方法。
虽然通用,但是前提必须有指定类,并对该类进行对象的创建,才可以调用getClass方法。
2. 使用的任意数据类的一个静态成员class,所有的数据类型都具备的这一个属性。
好处:不用new对象。但是,还需要使用具体的类。
3. 使用Class类中的forName方法。通过给定类名来获取对应的字节码文件对象。
只要知道类的名字就可以了。获取对应的字节码文件直接由forName方法自动完成。
这就是反射技术使用的获取字节码文件对象的方式。
通过newInstance()就可以创建字节码对象所表示的类的实例。
通过new创建给定的类的实例。
调用该类的构造函数。
* 通常被反射的类都会有提供空参数的构造函数。
* 如果没有对应的构造函数,会报 InstantiationException
* 如果有提供,但是权限不够,会报 lllegalAccessException
Person p = new Person();
加载Person类,并将Person类封装成字节码文件对象。
通过new创建Person对象。
调用构造函数对对象初始化。
如果要通过指定的构造函数初始化对象怎么办呢?
1. 获取字节码文件对象。
2. 获取给定的构造函数。
3. 通过构造函数初始化对象。
public static void getConstructorDemo() throws Exception { String className = "cn.itcast.domain.Person"; Class clazz = Class.forName(className); //获取指定的构造器。获取Person类中两个参数string,int的构造函数。 Constructor cons = clazz.getConstructor(String.class,int.class); //有了构造器对象后,通过构造器对象来初始化给类对象。 Object obj = cons.newInstance("wangwu",23); //Person p = new Person("lisi",21); }
获取字段
public static void getFieldDemo() throws Exception { String className = "cn.itcast.domain.Person"; Class clazz = Class.forName(className); String fieldName = "age"; //获取age字段对象。 // Field field = clazz.getField(fieldName);//获取是公共的字段。 Field field = clazz.getDeclaredField(fieldName); // getXXX:获取都是类中公共的成员。 // getDeclaredXXX:获取本类中已有的成员。 // System.out.println(field); //对其进行值的设置,必须先有对象。 Object obj = clazz.newInstance(); //通过查找父类AccessiableObject的方法。setAccessiable(true); field.setAccessible(true);//取消权限检查,暴力访问。一般不访问私有。 field.set(obj, 30);//IllegalAccessException:age字段是私有的。 System.out.println(field.get(obj)); }
获取方法
public static void getMethodDemo2() throws Exception { String className = "cn.itcast.domain.Person"; Class clazz = Class.forName(className); String methodName = "staticShow"; Method method = clazz.getMethod(methodName, null); // null表示没有参数 和返回值完全没有关系 method.invoke(null, null); 对象设置为 null 第二个null表示没有参数 } public static void getMethodDemo() throws Exception { String className = "cn.itcast.domain.Person"; Class clazz = Class.forName(className); String methodName = "show"; Method method = clazz.getMethod(methodName, String.class,int.class); Object obj = clazz.newInstance(); method.invoke(obj, "wangcai",20); 实例方法要手动传入 对象 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律