菜单

Java 反射很容易实现。

目录

Java 反射很容易实现。

Java反射本节介绍使 API 使用更加便捷的实用类。

什么是反射?

反射 API“牙齿,”java.lang.reflect它包含在包装内。
此 API 从 Java 类中检索字段和方法等信息。
我们将主要使用以下类。

  • java.lang.Class
  • java.lang.reflect.Constructor
  • java.lang.reflect.Method
  • java.lang.reflect.field

反射使用这种方法,您可以避免直接编写类创建和方法调用的代码。
你可以创建类实例并从字符串执行方法。

通过在 XML 等外部文件中定义类名和方法名,应用程序可以动态地适应运行时环境的变化。
此外,它还是一个非常有效的API,可用于构建高度灵活的应用程序。


反思的目的

反射虽然用户并不经常直接使用它,
它广泛应用于 Struts 等 Web 应用程序和 O/R 映射等框架中。

例如,当您想自动将网页屏幕上的输入数据设置到 JavaBeans 属性中时,
例如,在发出 SQL 查询以自动更新 JavaBeans 属性时,就会用到这种方法。

此外,还提供动态加载和注册插件等功能,以便在应用程序启动时扩展其功能。反射使用[这种方法]可以轻松实现这一点。

执行示例

现在,请运行示例代码,亲自体验基于框架的编程。

这里我们将使用以下类反射这展示了该工具的一种简单使用方法。

Main.java要执行的类
BeanUtil.java反射实用类
FreeSoft.java……这是一个代表自由软件的类,用作反射。

●按常规方式执行

System.out.println(“>>正常情况”);
FreeSoft freeSoft = new FreeSoft();
freeSoft.setName(聊天和即时通讯——也支持聊天和即时通讯!!)“);
freeSoft.showName();
freeSoft.showPrice(0);

●当使用反射执行时

System.out.println(>>>使用反射时)“);
// 创建 FreeSoft 类的实例
Object invokeObject = BeanUtil.newInstance(“FreeSoft”)”);
// 为名称字段设置值。
BeanUtil.setProperty(invokeObject, “姓名” , “聊天和即时通讯——聊天和即时通讯也一样!!”);
// 执行 FreeSoft 的 showName() 方法。
BeanUtil.invoke(invokeObject, “showName”, , 无效的);
// 执行 FreeSoft 的 showPrice() 方法。
// 如果该方法有参数,则必须将它们作为 Object 类型的数组传递。
BeanUtil.invoke(invokeObject, “显示价格”,new Object[]{new Integer(0)});

●执行结果

无论是否使用反射,执行结果都是一样的。

>>>正常情况

软件名称:聊天和即时通讯!

价格:0日元

>>>使用反射时

软件名称:聊天和即时通讯!

价格:0日元

BeanUtil 方法详情

newInstance

public static Object newInstance(字符串类名)抛出异常
这会根据字符串“className”创建并返回一个实例。

参数:
类名 - 完全限定类名
返回值:
完全限定类名的新实例
例外:
例外

newInstance

public static Object newInstance(String className, Object[] argObj) 抛出异常
这会根据字符串“className”创建并返回一个实例。

参数:
类名 - 完全限定类名
argObj – 构造函数参数
返回值:
完全限定类名的新实例
例外:
例外

newInstance

public static Object newInstance(类 clazz)抛出异常
这会创建并返回类“clazz”的一个实例。

参数:
克拉兹 - 班级
返回值:
克拉兹的新实例
例外:
例外

newInstance

public static Object newInstance(Class clazz, Object[] argObj) 抛出异常
这会创建并返回类“clazz”的一个实例。

参数:
克拉兹 - 班级
argObj – 构造函数参数
返回值:
克拉兹的新实例
例外:
例外

设置属性

public static void 设置属性(Object invokeObject, String fieldName, Object value) 抛出异常
调用对象“invokeObject”的字段“fieldName”的setter方法来存储值“value”。

如果没有 setter 方法,则会直接将值赋给字段。但是,在这种情况下,目标属性的访问修饰符必须为 public。

参数:
调用对象 要执行的对象
字段名 – 要执行的对象的属性名称
受到推崇的 – 要设置的值
例外:
例外 – 出现以下异常:
调用目标异常 - 当底层方法抛出异常时
非法访问异常 此方法对象是 Java
如果实现了语言访问控制,并且无法访问底层方法。
NoSuchMethodException - 如果找不到具有指定名称的方法

获取属性

public static Object 获取属性(Object invokeObject, String fieldName) 抛出异常
调用 invokeObject 对象的 fieldName 的 getter 方法来检索其值。
如果没有 getter 方法,则会直接从字段中获取值。但是,在这种情况下,目标属性的访问修饰符必须为 public。

参数:
调用对象 要执行的对象
字段名 – 要执行的对象的属性名称
返回值:
Getter 方法返回值
例外:
例外 – 出现以下异常:
调用目标异常 - 当底层方法抛出异常时
非法访问异常 此方法对象是 Java
如果实现了语言访问控制,并且无法访问底层方法。
NoSuchFieldException - 如果找不到具有指定名称的字段

调用

public static Object 调用(Object invokeObject, String callMethod, Object[] argObjects) 抛出 InvocationTargetException、IllegalAccessException 或 NoSuchMethodException 异常
这将执行对象“invokeObject”的“callMethod”方法。
如果有返回值,可以将其作为对象获取。

参数:
调用对象 要执行的对象
调用方法 – 要执行的方法名称
argObjects – 如果有参数,则以对象数组的形式传递。如果没有参数,则传递 null 值。
返回值:
执行“callMethod”的返回值
例外:
调用目标异常 - 当底层方法抛出异常时
非法访问异常 此方法对象是 Java
如果实现了语言访问控制,并且无法访问底层方法。
NoSuchMethodException - 如果找不到具有指定名称的方法

查找方法

public static 方法 查找方法(Object invokeObject, String callMethod, Object[] argObjects) 抛出 NoSuchMethodException
这会查找对象“invokeObject”的方法“callMethod”。

参数:
调用对象 要执行的对象
调用方法 – 要执行的对象的方法名称
argObjects – 如果有参数,则以对象数组的形式传递。如果没有参数,则传递 null 值。
返回值:
符合指定参数条件的方法对象
例外:
NoSuchMethodException - 如果找不到匹配的方法,或者名称为“”或“”

setField

public static void setField(Object invokeObject, String fieldName, Object value) 抛出 IllegalAccessException, NoSuchFieldException
值“value”存储在要执行的对象“invokeObject”的名为“fieldName”的字段中。

参数:
调用对象 要执行的对象
字段名 – 要执行的对象的字段名称
受到推崇的 – 要设置的值
例外:
非法访问异常 – 指定的对象是基字段(或其子类或实现)。
如果它不是声明它的类或接口的实例,或者解包转换失败。
NoSuchFieldException - 如果找不到具有指定名称的字段

获取字段

public static Object 获取字段(Object invokeObject, String fieldName) 抛出 IllegalAccessException 或 NoSuchFieldException
这将检索正在执行的对象“invokeObject”的字段名称“fieldName”的值。

参数:
调用对象 要执行的对象
字段名 – 要执行的对象的字段名称
返回值:
返回值
例外:
非法访问异常 – 指定的对象是基字段(或其子类或实现)。
如果它不是声明它的类或接口的实例,或者解包转换失败。
NoSuchFieldException - 如果找不到具有指定名称的字段

hasField

公共静态布尔值 hasField(Object object, String fieldName) 抛出异常
此语句检查对象“object”是否声明了名为“fieldName”的字段。

参数:
目的 待检查对象
字段名 – 要检查的字段名称
返回值:
如果声明为真,则为真
例外:
例外

获取所有字段

public static java.util.TreeSet 获取所有字段(对象对象)抛出异常
参数:
目的
返回值:
例外:
例外

获取短类名

public static String 获取短类名(对象对象)
此函数从对象中检索非限定类名。

参数:
目的
返回值:

获取短类名

public static String 获取短类名(字符串类名)
这会从完全限定名称中检索类名。

参数:
类名
返回值:

GETFieldName

public static String GETFieldName(字符串方法名)
将字段名从方法名更改为其他名称。这必须符合 JavaBeans 的命名规范。

参数:
数据名称
返回值:

isClassExist

公共静态布尔值 isClassExist(字符串类名)
这会检查完全限定名称“className”是否为存在的类名。

参数:
类名
返回值:

获取属性描述符

public static PropertyDescriptor[] 获取属性描述符(对象对象)抛出 IntrospectionException
这将返回一个 PropertyDescriptor,其中包含“object”的对象信息。

参数:
目的
返回值:
例外:
java.beans.IntrospectionException

BeanUtil 源代码

  • URLをコピーしました!
目录