菜单

Java 反射变得简单

目录

Java 反射变得简单

java起来反照引入实用程序类,方便访问应用程序接口。

什么是反思?

反射 API的"java.lang.reflect.” 包含在包装中,
这是一个从 Java 类检索字段和方法等信息的 API。
主要用到以下几个类。

  • java.lang.Class.
  • 构造函数。
  • 方法
  • java.lang.reflect.Field.

反照通过使用,您可以创建类或调用方法,而无需直接对其进行编码。
您可以从字符串创建类实例或执行方法。

通过将类名和方法名的定义写入外部文件(例如 XML)中,您可以动态地使应用程序适应运行时环境的变化。
它也是构建高度灵活的应用程序的非常有效的 API。


反思的目的

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

例如,当自动将 Web 屏幕输入数据设置为 JavaBeans 属性时,
它在发出基于 JavaBeans 属性自动更新的 SQL 时使用。

此外,诸如在应用程序启动时动态加载和注册可扩展功能的插件等功能都是反照使用

运行样本

现在,请运行示例,体验框架式编程。

这里使用了以下类别反照简要介绍如何使用该实用程序。

Main.java......要执行的类。
BeanUtil.java......供思考的实用类。
FreeSoft.java... 在代表 FreeSof 的类中用作反射。

照常执行时

System.out.println(">>> 正常情况"。);
FreeSoft freeSoft = new FreeSoft();.
freeSoft.setName("聊天&信使 聊天和信使!");
freeSoft.showName();.
freeSoft.showPrice(0);.

使用反射时

System.out.println(使用反射时")。);
// FreeSoft 类的实例化。
对象 invokeObject = BeanUtil.newInstance("FreeSoft")。);
// 在名称字段中设置一个值。
BeanUtil.setProperty(invokeObject,. "名称"。 , "聊天&信使 聊天和信使!");
// FreeSoft 的 showName() 方法。
BeanUtil.invoke(invokeObject,. "showName"(显示名称)。,空);
// FreeSoft 的 showPrice() 方法。
// 如果方法有参数,则必须以对象类型的数组形式传递。
BeanUtil.invoke(invokeObject,. "showPrice"(显示价格)。,new Object[]{new Integer(0)});.

执行结果

正常情况下和使用反射时的执行结果是一样的。

>> >> 正常情况。

软件名称: Chat&Messenger 聊天和信使!

价格 : 0 日元

>> >> 使用反射时。

软件名称: Chat&Messenger 聊天和信使!

价格 : 0 日元

BeanUtil 方法的详细信息。

新实例

public static Object 新实例(字符串 className)
                                    抛出异常
根据字符串 "className "创建并返回一个实例。

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

新实例

public static Object 新实例(字符串 className,.
                                           对象[] argObj)
                                    抛出异常
根据字符串 "className "创建并返回一个实例。

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

新实例

public static Object 新实例类
                                    抛出异常
从类 "clazz "中创建并返回一个实例。

参数:.
- 类
返回值:.
新的 clazz 实例。
例外情况:.
例外情况。

新实例

public static Object 新实例(Class clazz,.
                                           对象[] argObj)
                                    抛出异常
从类 "clazz "中创建并返回一个实例。

参数:.
- 类
argObj - 构造函数参数
返回值:.
新的 clazz 实例。
例外情况:.
例外情况。

设置属性

public static void 设置属性(对象 invokeObject、.
                               字符串 fieldName、字符串
                               对象值)
                        抛出异常
调用对象“invokeObject”的字段“fieldName”的setter方法并存储值“value”。

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

参数:.
调用对象 - 要执行的对象。
字段名 - 要执行的对象的属性名称。
价值 - 要设置的值。
例外情况:.
例外情况。 - 出现以下例外情况。
调用目标异常 - 如果底层方法抛出异常
非法访问异常 – 这个Method对象是Java
当实现语言访问控制而无法访问底层方法时
NoSuchMethodException - 如果无法找到指定名称的方法

获取属性

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

参数:.
调用对象 - 要执行的对象。
字段名 - 要执行的对象的属性名称。
返回值:.
获取方法的返回值
例外情况:.
例外情况。 - 出现以下例外情况。
调用目标异常 - 如果底层方法抛出异常
非法访问异常 – 这个Method对象是Java
当实现语言访问控制而无法访问底层方法时
NoSuchFieldException - 如果未找到指定名称的字段

调用

public static Object 调用(对象 invokeObject)。
                                      字符串 callMethod,.
                                      对象[] argObjects)
                               抛出 InvocationTargetException,.
                                      非法访问异常, NoSuchMethodException
                                      无方法异常
执行对象“invokeObject”的方法“callMethod”。
如果有返回值,则可以以 Object 的形式获取。

参数:.
调用对象 - 要执行的对象。
调用方法 - 要执行的方法名称
argObjects. - 如果有参数,则以对象数组的形式传递。 如果没有参数,则传递空值。
返回值:.
执行 "callMethod "的返回值。
例外情况:.
调用目标异常 - 如果底层方法抛出异常
非法访问异常 – 这个Method对象是Java
当实现语言访问控制而无法访问底层方法时
NoSuchMethodException - 如果无法找到指定名称的方法

查找方法

公共静态方法 查找方法(对象 invokeObject)。
                                                  字符串 callMethod,.
                                                  对象[] argObjects)
                                           抛出 NoSuchMethodException
搜索对象 "invokeObject "的方法 "callMethod"。

参数:.
调用对象 - 要执行的对象。
调用方法 - 要执行的对象的方法名称。
argObjects. - 如果有参数,则以对象数组的形式传递。 如果没有参数,则传递空值。
返回值:.
与指定参数条件相匹配的方法对象。
例外情况:.
NoSuchMethodException - 如果没有找到匹配的方法,或者名称为""或""。

设置字段

public static void 设置字段(对象 invokeObject、.
                            字符串 fieldName、字符串
                            对象值)
                     throws IllegalAccessException,.
                            NoSuchFieldException
将值 "value "存储到要执行的对象 "invokeObject "的字段名 "fieldName "中。

参数:.
调用对象 - 要执行的对象。
字段名 - 要执行的对象的字段名称。
价值 - 要设置的值。
例外情况:.
非法访问异常 – 指定对象所基于的字段(或其子类或实现者)
不是它声明的类或接口的实例,或者展开转换失败
NoSuchFieldException - 如果未找到指定名称的字段

getField

public static Object getField(对象 invokeObject)。
                                        字符串 fieldName)
                                 throws IllegalAccessException,.
                                        NoSuchFieldException
获取要执行的对象 "invokeObject "的字段名 "fieldName "的值。

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

hasField

public static boolean hasField对象
                               字符串 fieldName)
                        抛出异常
检查对象 "object "是否声明了字段名 "fieldName"。

参数:.
反对 - 检查对象。
字段名 - 检查区域名称
返回值:.
如果声明为 True
例外情况:.
例外情况。

getAllFields.

public static java.util.TreeSet getAllFields.(对象)。
                                      抛出异常
参数:.
反对
返回值:.
例外情况:.
例外情况。

获取短类名

public static String 获取短类名(对象 object)
从对象中获取未限定的类名。

参数:.
反对
返回值:.

获取短类名

public static String 获取短类名(字符串 className)
从全称中获取类名。

参数:.
类名
返回值:.

getFieldName

public static String getFieldName(字符串 methodName)
根据方法名称更改字段名称。 必须符合 JavaBeans 的约定。

参数:.
方法名
返回值:.

isClassExist.

public static boolean isClassExist.(字符串 className)
验证全限定名称 "className "是否为现有类名。

参数:.
类名
返回值:.

获取属性描述符。

public static PropertyDescriptor[]. 获取属性描述符。对象
                                                              抛出 IntrospectionException
返回一个 PropertyDescriptor,其中包含 "object "的对象信息。

参数:.
反对
返回值:.
例外情况:.
java.beans.IntrospectionException

BeanUtil 源代码

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