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 的类中用作反射。
照常执行时
FreeSoft freeSoft = new FreeSoft();.
freeSoft.setName("聊天&信使 聊天和信使!");
freeSoft.showName();.
freeSoft.showPrice(0);.
使用反射时
// 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 源代码
/**
* 实用类,可以让你轻松使用Java的反射API
*/
公共类 BeanUtil {
/** */
私有静态最终字符串 GET = “GET”;
/** */
私有静态最终字符串SET =“SET”;
// ————————————————————-『newInstance』
/**
* 从字符串“className”生成并返回一个实例。
* @param className 完全限定类名
* @return 完全限定类名的新实例
* @抛出异常
*/
公共静态对象 newInstance(String className) 抛出异常 {
尝试 {
return Class.forName(className).newInstance();
} catch (NoClassDefFoundError e) {
System.err.println(“NoClassDefFoundError:” + 类名);
扔 e;
}
}
/**
* 从字符串“className”生成并返回一个实例。
* @param className 完全限定类名
* @param argObj 构造函数参数
* @return 完全限定类名的新实例
* @抛出异常
*/
公共静态对象 newInstance(String className, Object[] argObj)
抛出异常{
Class[] argClass = new Class[argObj.length];
for (int i = 0; i < argObj.length; i++) {
argClass[i] = argObj[i].getClass();
}
构造函数 c = Class.forName(className).getConstructor(argClass);
返回 c.newInstance(argObj);
}
/**
* 创建并返回类“clazz”的实例。
* @param clazz 类
* @return clazz的新实例
* @抛出异常
*/
公共静态对象 newInstance(Class clazz) 抛出异常 {
返回 clazz.newInstance();
}
/**
* 创建并返回类“clazz”的实例。
* @param clazz 类
* @param argObj 构造函数参数
* @return clazz的新实例
* @抛出异常
*/
公共静态对象 newInstance(类 clazz, Object[] argObj)
抛出异常{
Class[] argClass = new Class[argObj.length];
for (int i = 0; i < argObj.length; i++) {
argClass[i] = argObj[i].getClass();
}
构造函数 c = clazz.getConstructor(argClass);
返回 c.newInstance(argObj);
}
// - - - - - - - - - - -“方法”
/**
* 对象“invokeObject”的字段“fieldName”的Setter方法
* 调用,存储值'value'。
* <br>
* 如果没有setter方法,则直接将值设置到字段中。
* 但是,在这种情况下,目标属性的访问修饰符必须是 public。
* @param invokeObject 要执行的对象
* @param fieldName 要执行的对象的属性名称
* @param value 要设置的值
* @throws Exception 发生以下异常。
* 如果底层方法抛出异常,则@throws InvokingTargetException
* @throws IllegalAccessException 如果此 Method 对象是 Java
* 当实现语言访问控制而无法访问底层方法时
* 如果未找到指定名称的方法,则@抛出NoSuchMethodException
*/
公共静态无效setProperty(对象invokeObject,字符串字段名称,
对象值)抛出异常 {
尝试 {
方法 method = searchMethod(invokeObject, fieldName, SET);
Class[] paramClasses = method.getParameterTypes();
对象[] valueArray = null;
if (paramClasses[0].isInstance(value)) {
//如果要设置的对象是参数类的子类,则不进行转换。
valueArray = new Object[] { 值 };
} 别的 {
valueArray = new Object[] { convObject(值, paramClasses[0]
.getName()) };
}
方法.invoke(invokeObject, valueArray);
} catch (NoSuchMethodException e) {
尝试 {
// 如果没有setter方法,则直接设置到字段。
setField(invokeObject, 字段名, 值);
} catch (NoSuchFieldException fe) {
字符串 errorMes = “\nClass” + getShortClassName(invokeObject)
+“是”+“对于字段“”+字段名称+“”\n”
+“没有可访问的 setter 方法,并且。”
+ “字段”” + 字段名称
+“”也不公开。 ” + “”;
抛出新的 IllegalAccessException(errorMes);
}
}
}
/**
* 对象invokeObject的字段fieldName的Getter方法
* 获取调用值。 <br>
* 如果没有getter方法,则直接从字段获取值。
* 但是,在这种情况下,目标属性的访问修饰符必须是 public。
* @param invokeObject 要执行的对象
* @param fieldName 要执行的对象的属性名称
* @return getter方法的返回值
* @throws Exception 发生以下异常。
* 如果底层方法抛出异常,则@throws InvokingTargetException
* @throws IllegalAccessException 如果此 Method 对象是 Java
* 当实现语言访问控制而无法访问底层方法时
* 如果未找到具有指定名称的字段,则@抛出NoSuchFieldException
*/
公共静态对象 getProperty(对象 invokeObject,字符串字段名称)
抛出异常{
尝试 {
方法 method = searchMethod(invokeObject, fieldName, GET);
return method.invoke(invokeObject, null);
} catch (NoSuchMethodException e) {
返回 getField(invokeObject, fieldName);
}
}
/**
* 执行对象“invokeObject”的方法“callMethod”。
* 如果有返回值,可以以Object类型获取。
* @param invokeObject 要执行的对象
* @param callMethod 要执行的方法名
* @param argObjects 如果有参数,则将其作为对象数组传递。
* 如果没有参数则传递 null。
* @return 执行“callMethod”的返回值
* 如果底层方法抛出异常,则@throws InvokingTargetException
* @throws IllegalAccessException 如果此 Method 对象是 Java
* 当实现语言访问控制而无法访问底层方法时
* 如果未找到指定名称的方法,则@抛出NoSuchMethodException
*/
公共静态对象调用(对象invokeObject,字符串callMethod,
Object[] argObjects) 抛出 InitationTargetException,
IllegalAccessException,NoSuchMethodException {
方法 method = findMethod(invokeObject, callMethod, argObjects);
return method.invoke(invokeObject, argObjects);
}
/**
* 搜索对象“invokeObject”的方法“callMethod”。
* @param invokeObject 要执行的对象
* @param callMethod 要执行的对象的方法名称
* @param argObjects 如果有参数,则将其作为对象数组传递。
* 如果没有参数则传递 null。
* @return 与指定参数条件匹配的方法对象
* @throws NoSuchMethodException 如果没有找到匹配的方法,
* 或者如果名称是“ “ 或者 ” “如果是
*/
公共静态方法findMethod(对象invokeObject,字符串callMethod,
Object[] argObjects) 抛出 NoSuchMethodException {
类[] paramClasses = null;
Method[] 方法 = invokeObject.getClass().getMethods();
顶部: for (int i = 0; i <methods.length; i++) {
if (methods[i].getName().equals(callMethod)) {
if (argObjects == null
&& 方法[i].getParameterTypes().length == 0) {
返回方法[i];
}
if (argObjects == null) {
继续;
}
paramClasses = 方法[i].getParameterTypes();
if (paramClasses.length == argObjects.length) {
// 验证所有参数列表类型和实参类型
for (int j = 0; j < paramClasses.length; j++) {
类 paramClass = paramClasses[j];
对象 argObj = argObjects[j];
// 如果参数类型是原始类型,则参数对象
// 不为 null 并且是原始类型
//如果是Number的子类就可以了。
if (argObj == null) {
继续;
}
if (paramClass.isPrimitive()
&& (argObj 实例编号 || argObj
.getClass().isPrimitive())) {
继续;
}
if (!paramClass.isInstance(argObj)) {
// 当类型不兼容隐式转换时,继续执行下一个方法
继续顶部;
}
}
返回方法[i];
}
}
}
字符串 paramLength = (paramClasses != null) ? 整数
.toString(paramClasses.length) : “”;
字符串 errorMes = getShortClassName(invokeObject) + “方法”
+ callMethod + “没有。” + “[ paramClasses.length ] = ”
+ paramLength + “,[ argObjects.length ] = ” + argObjects.length
+ “”;
抛出新的NoSuchMethodException(errorMes);
}
// - - - - - - - - - - - “场地”
/**
* 要执行的对象“invokeObject”的字段名称“fieldName”的值
* 存储“值”。
* @param invokeObject 要执行的对象
* @param fieldName 待执行对象的字段名
* @param value 要设置的值
* @throws IllegalAccessException 如果指定的对象是
* 字段(或其子类或实现者)
* 如果不是类或接口的实例,则声明
* 或者如果解包转换失败
* 如果未找到具有指定名称的字段,则@抛出NoSuchFieldException
*/
公共静态无效setField(对象invokeObject,字符串字段名称,
对象值)抛出 IllegalAccessException、NoSuchFieldException {
字段 field = searchField(invokeObject, fieldName);
String className = field.getType().getName();
对象 convObj = null;
if (field.getType().isInstance(value)) {
convObj = 值;
} 别的 {
convObj = convObject(值, 类名);
}
field.set(invokeObject, convObj);
}
/**
* 将执行对象“invokeObject”的字段名“fieldName”的值设置为
* 得到。
* @param invokeObject 要执行的对象
* @param fieldName 待执行对象的字段名
* @return 返回值
* @throws IllegalAccessException 如果指定的对象是
* 字段(或其子类或实现者)
* 如果不是类或接口的实例,则声明
* 或者如果解包转换失败
* 如果未找到具有指定名称的字段,则@抛出NoSuchFieldException
*/
公共静态 Object getField(Object invokeObject, String fieldName)
抛出 IllegalAccessException, NoSuchFieldException {
字段 field = searchField(invokeObject, fieldName);
返回 field.get(invokeObject);
}
/**
* 检查对象“object”是否声明字段名“fieldName”
* 确认。
* @param object 要检查的对象
* @param fieldName 要检查的字段名称
* @return true 如果声明
* @抛出异常
*/
公共静态布尔hasField(对象对象,字符串字段名称)
抛出异常{
PropertyDescriptor[] props = getPropertyDescriptors(object);
for (int i = 0; i < props.length; i++) {
String _fieldName = props[i].getName();
if (fieldName.equals(_fieldName)) {
返回真;
}
}
返回假;
}
/**
*
* @param对象
* @返回
* @抛出异常
*/
公共静态TreeSet getAllFields(对象对象)抛出异常{
TreeSet fieldSet = new TreeSet();
// 从方法中获取属性名称
PropertyDescriptor[] props = getPropertyDescriptors(object);
for (int i = 0; i < props.length; i++) {
String fieldName = props[i].getName();
fieldSet.add(fieldName);
}
// 从字段中获取属性名称
Field[] fields = object.getClass().getFields();
for (int i = 0; i < fields.length; i++) {
String fieldName = fields[i].getName();
if (!fieldSet.contains(fieldName)) {
fieldSet.add(fieldName);
}
}
返回字段集;
}
/**
*
* @param invokeObject 要执行的对象
* @param fieldName 待执行对象的字段名
* @return 与指定参数条件匹配的归档对象
* 如果未找到具有指定名称的字段,则@抛出NoSuchFieldException
*/
私有静态字段 searchField(Object invokeObject, String fieldName)
抛出 NoSuchFieldException {
尝试 {
返回invokeObject.getClass().getField(fieldName);
} catch (NoSuchFieldException e) {
// 这个作用域是从表列名中获取的
字段名称 = checkFieldName(字段名称);
Field[] fields = invokeObject.getClass().getFields();
for (int i = 0; i < fields.length; i++) {
if (fields[i].getName().equalsIgnoreCase(fieldName)) {
返回字段[i];
}
}
抛出新的NoSuchFieldException(字段名称);
}
}
// - - - - - - - - - - - “ 其他的 ”
/**
* 从对象中获取非限定类名。
* @param对象
* @返回
*/
公共静态字符串 getShortClassName(对象对象){
如果(对象==空){
返回“空”;
}
字符串名称 = object.getClass().getName();
返回 getShortClassName(名称);
}
/**
* 从完全限定名称中获取类名称。
* @param 类名
* @返回
*/
公共静态 String getShortClassName(String className) {
int index = className.lastIndexOf(“.”);
return className.substring(index + 1);
}
/**
* 更改方法名称中的字段名称。符合 JavaBeans 约定
* 是需要的。
* @param 方法名
* @返回
*/
公共静态 String getFieldName(String 方法名称) {
字符串字段名 = null;
if (methodName.startsWith(“is”)) {
字段名 = 方法名.substring(2);
} 别的 {
字段名 = 方法名.substring(3);
}
字段名称 = convString(字段名称, 0, “L”);
返回字段名;
}
/**
* 验证完全限定名称“className”是现有的类名称。
* @param 类名
* @返回
*/
公共静态布尔 isClassExist(String className) {
尝试 {
Class.forName(类名);
返回真;
} catch (异常 e) {
返回假;
}
}
私有最终静态Map beanInfoCache = new HashMap();
/**
* 返回一个PropertyDescriptor,它保存“object”的对象信息。
* @param对象
* @返回
* @抛出内省异常
*/
公共静态PropertyDescriptor [] getPropertyDescriptors(对象对象)
抛出内省异常 {
BeanInfo beanInfo = (BeanInfo) beanInfoCache.get(object.getClass());
if (beanInfo == null) {
beanInfo = Introspector.getBeanInfo(object.getClass());
beanInfoCache.put(object.getClass(), beanInfo);
}
// BeanInfo beanInfo = Introspector.getBeanInfo(object.getClass());
返回 beanInfo.getPropertyDescriptors();
}
// ————————————————————————–
// ———————————————“下面的私有方法”
// ————————————————————————–
/**
* 根据PropertyDescriptor搜索参数fieldName的访问器方法。
* @param invokeObject 要执行的对象
* @param fieldName 字段名称
* @param type Getter 方法 ⇒ GET Getter 方法 ⇒ SET
* @return 与指定参数条件匹配的方法对象
* @throws NoSuchMethodException 如果没有找到匹配的方法,
* 或者如果名称是“ “ 或者 ” ”
* 如果是
* @抛出内省异常
*/
私有静态方法 searchMethod(Object invokeObject, String fieldName,
字符串类型)抛出 NoSuchMethodException、IntrospectionException {
方法方法=空;
字段名称 = checkFieldName(字段名称);
PropertyDescriptor[] props = getPropertyDescriptors(invokeObject);
for (int i = 0; i < props.length; i++) {
字符串名称 = props[i].getName();
if (!name.equalsIgnoreCase(fieldName)) {
继续;
}
if (type.equals(GET)) {
方法 = props[i].getReadMethod();
} 别的 {
方法 = props[i].getWriteMethod();
}
如果(方法==空){
继续;
}
返回方法;
}
// 如果该方法不存在。
throw new NoSuchMethodException(“类没有方法。”
+ “(不区分大小写。):” + type.toLowerCase()
+ convString(字段名称, 0, “U”) + “()”);
}
/**
* 检查参数fieldName是否是列名;如果是列名,
* 转换回来。
*
* MAIL_ADDRESS ⇒ MAILADDRESS ↓ 邮件地址 = 邮件地址
* @param fieldName 字段名或列名
* @return 字段名
*/
私有静态字符串 checkFieldName(String fieldName) {
int index = fieldName.indexOf(“_”);
而(真){
如果(索引==-1){
返回字段名;
}
StringBuffer convcloumn = new StringBuffer(fieldName);
convcloumn.deleteCharAt(索引);
字段名称 = convcloumn.toString();
index = fieldName.indexOf(“_”);
}
}
/**
* 将要转换的对象object转换为convClassName的类型。
*
* @param object 要转换的对象
* @param convClassName 要转换的类型的类字符串
* @return 转换后的对象
*/
私有静态对象 convObject(对象对象,字符串 convClassName) {
如果(对象==空){
// 转换为基本类型时返回 null 会导致错误。
// 使其成为 0 的包装器。
if (convClassName.equals(“int”)) {
返回新整数(0);
} else if (convClassName.equals(“long”)) {
返回新的长(0);
} 别的 {
返回空值;
}
}
if (object.getClass().getName().equals(convClassName)) {
返回对象;
}
// ——————————————-『字符串的对象实例』
if (字符串的对象实例) {
if (convClassName.equals(“java.lang.String”)) {
返回对象;
} else if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“long”)) {
字符串 str = (字符串) 对象;
如果(isExist(str)){
// 如果不转换一次BigDecimal就不好了
// 1000.00000
BigDecimal big = new BigDecimal(str);
返回新的 Long(big.longValue());
} 别的 {
// 如果 str 是 shell 文字,则将初始值设置为“0”
返回新的长(0);
}
} else if (convClassName.equals(“java.sql.Date”)) {
返回 SqlDate((String) 对象);
} else if (convClassName.equals(“java.sql.Timestamp”)) {
日期日期 = toSqlDate((String) 对象);
返回新时间戳(date.getTime());
} else if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
// 如果 str 是 shell 文字,则将初始值设置为“0”
字符串 str = (字符串) 对象;
如果(isExist(str)){
BigDecimal big = new BigDecimal(str);
返回新的整数(big.intValue());
} 别的 {
返回新整数(0);
}
} else if (convClassName.equals(“boolean”)) {
return Boolean.valueOf(object.toString());
} else if (convClassName.equals(“java.math.BigDecimal”)) {
字符串临时 = ((String) 对象).trim();
// 如果 temp.length() == 0,则可以安全地将其设置为 null 而不是 0。
if (temp.length() == 0) {
返回空值;
} 别的 {
返回新的 BigDecimal(temp);
}
}
throwNoSupprt(对象, convClassName);
}
// ———————————“java.sql.Date 对象实例”
else if (java.sql.Date 对象实例) {
if (convClassName.equals(“java.lang.String”)) {
return toStringDate((java.sql.Date) 对象, “yyyy/MM/dd”);
} else if (convClassName.equals(“java.sql.Date”)) {
返回对象;
} else if (convClassName.equals(“java.sql.Timestamp”)) {
返回新时间戳(((Date)对象).getTime());
}
throwNoSupprt(对象, convClassName);
}
// ———————————-『时间戳的对象实例』
else if (时间戳对象实例) {
长时间 = ((时间戳) 对象).getTime();
if (convClassName.equals(“java.lang.String”)) {
return toStringDate(时间,“yyyy/MM/dd HH:mm:ss”);
} else if (convClassName.equals(“java.sql.Date”)) {
返回新的 java.sql.Date(时间);
} else if (convClassName.equals(“java.sql.Timestamp”)) {
返回对象;
}
throwNoSupprt(对象, convClassName);
}
// ——————————————-『Integer 的对象实例』
else if (对象实例整数) {
if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
返回对象;
} else if (convClassName.equals(“java.lang.String”)) {
返回对象.toString();
} else if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“long”)) {
return new Long(((Integer) object).longValue());
} else if (convClassName.equals(“java.math.BigDecimal”)) {
返回 new BigDecimal(((Integer) object).intValue());
}
throwNoSupprt(对象, convClassName);
}
// ——————————————『Long对象实例』
else if (对象实例长) {
if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“long”)) {
返回对象;
} else if (convClassName.equals(“java.lang.String”)) {
返回对象.toString();
} else if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
返回新的 Integer(((Long) 对象).intValue());
} else if (convClassName.equals(“java.math.BigDecimal”)) {
返回新的 BigDecimal(((Long) 对象).longValue());
}
throwNoSupprt(对象, convClassName);
}
// ——————————————-『Double 对象实例』
else if (双精度对象实例) {
if (convClassName.equals(“java.lang.String”)) {
// 列号(8,0)
// windows oracle > BigDecimal
// UNIX oracle > 双精度
BigDecimal big = new BigDecimal(((Double) 对象).doubleValue());
int 比例 = big.scale();
如果(比例== 0){
返回big.toString();
} 别的 {
// 如果需要舍入,则不支持。
throwNoSupprt(对象, convClassName);
}
}
if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
返回新的 Integer(((Double) 对象).intValue());
} else if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“long”)) {
返回 new Long(((Double) 对象).longValue());
} else if (convClassName.equals(“java.math.BigDecimal”)) {
返回 new BigDecimal(((Double) 对象).doubleValue());
}
throwNoSupprt(对象, convClassName);
}
// ———————————“BigDecimal 对象实例”
else if (BigDecimal 对象实例) {
if (convClassName.equals(“java.lang.String”)) {
返回对象.toString();
} else if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“long”)) {
返回 new Long(((BigDecimal) 对象).longValue());
} else if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
返回新的 Integer(((BigDecimal) 对象).intValue());
}
throwNoSupprt(对象, convClassName);
}
// ——————————————-『object instanceof byte[]』
else if (对象实例字节[]) {
if (convClassName.equals(“java.sql.Blob”)) {
返回对象;
}
throwNoSupprt(对象, convClassName);
}
// —————————————————“对象是布尔值”
else if (布尔对象实例) {
if (convClassName.equals(“boolean”)) {
返回对象;
}
throwNoSupprt(对象, convClassName);
}
// ——————————————-『对象是布尔值[]』
else if (对象实例布尔[]) {
if (convClassName.equals(“java.lang.String”)) {
布尔[] bs = (布尔[]) 对象;
StringBuffer buff = new StringBuffer(“[”);
for (int i = 0; i < bs.length; i++) {
buff.append(bs[i] + “,”);
}
buff.deleteCharAt(buff.length() – 1);
buff.append(“]”);
返回 buff.toString();
}
throwNoSupprt(对象, convClassName);
}
throwNoSupprt(对象, convClassName);
返回空值;
}
/**
*如果不支持转换则抛出异常。
*
* @param object 要转换的对象
* @param convClassName 要转换的类型
*/
私有静态无效 throwNoSupprt(对象对象,字符串 convClassName){
String className = (object != null) ? object.getClass().getName()
: “无效的”;
String errorMess = “\n尚不支持此对象的类型转换处理。\n”
+ ” [ 对象 ] = ” + 对象 + “,[ 对象类型 ] = ” + 类名
+ “,[convertClass] = ” + convClassName + “”;
抛出新的 UnsupportedOperationException(errorMess);
}
/**
* 将字符串[str]的位置[index]处的字符转换为大写或小写。
* <p>
* @param str 要评估的字符串
* @param index 指定位置
* @param toCase 转换为大写 ⇒ U | u 转换为小写 ⇒ L | l
* @return 转换后的字符串
*/
私有静态字符串 convString(字符串 str, int 索引, 字符串 toCase) {
if (str == null || str.trim().length() == 0) {
返回字符串;
} 别的 {
字符串 temp = str.substring(索引, 索引 + 1);
if (toCase.equalsIgnoreCase(“u”)) {
临时 = temp.toUpperCase();
} 别的 {
temp = temp.toLowerCase();
}
StringBuffer tempBuffer = new StringBuffer(str);
tempBuffer.replace(索引,索引+1,临时);
返回 tempBuffer.toString();
}
}
/**
* 验证[value]是否是有效值。
*
* @param value 要评估的字符串
* @return [true]: 如果不为 null 且不为“”
*/
私有静态布尔 isExist(字符串值) {
if (value != null && value.length() != 0) {
返回真;
}
返回假;
}
/**
* 指定格式的java.util.Date类或其子类
* 转换为字符串。
* @param date 要转换的java.util.Date类
* @parampattern指定格式
* @return 格式化日期字符串
*/
私有静态字符串toStringDate(日期日期,字符串模式){
SimpleDateFormat sdFormat = new SimpleDateFormat(pattern);
返回 sdFormat.format(日期);
}
私有静态 java.sql.Date toSqlDate(String strDate) {
日历 cal = toCalendar(strDate);
返回SqlDate(cal);
}
私有静态 java.sql.Date toSqlDate(日历 cal) {
长 l = cal.getTime().getTime();
返回新的 java.sql.Date(l);
}
/**
* 将长时间值转换为指定格式的字符串。
* @param time 表示当前时间的毫秒数的长值。
* @parampattern指定格式
* @return 格式化日期字符串
*/
私有静态字符串toStringDate(长时间,字符串模式){
返回到StringDate(新日期(时间),模式);
}
/**
* 字符串 ⇒ java.sql.Date
*
* 将以下日期字符串转换为java.sql.Date
* yyyy/MM/dd HH:mm:ss.SSS yyyy-MM-dd HH:mm:ss.SSS
*
* “20030407” “2003/04/07” “2003-04-07” “2003/04/07 15:20:16” “2003-04-07
* 15:20:16”
* @参数strDate
* @返回
*/
私有静态日历 toCalendar(String strDate) {
strDate = 格式(strDate);
Calendar cal = Calendar.getInstance();.
int yyyy = Integer.parseInt(strDate.substring(0, 4));
int MM = Integer.parseInt(strDate.substring(5, 7));
int dd = Integer.parseInt(strDate.substring(8, 10));
int HH = cal.get(日历.HOUR_OF_DAY);
int mm = cal.get(日历.分钟);
int ss = cal.get(日历.SECOND);
int SSS = cal.get(日历.MILLISECOND);
cal.clear();
cal.set(yyyy, MM – 1, dd);
int len = strDate.length();
开关(长度){
案例10:
休息;
情况 16: // yyyy/MM/dd HH:mm
HH = Integer.parseInt(strDate.substring(11, 13));
mm = Integer.parseInt(strDate.substring(14, 16));
cal.set(日历.HOUR_OF_DAY, HH);
cal.set(日历.分钟,毫米);
休息;
情况 19: // yyyy/MM/dd HH:mm:ss
HH = Integer.parseInt(strDate.substring(11, 13));
mm = Integer.parseInt(strDate.substring(14, 16));
ss = Integer.parseInt(strDate.substring(17, 19));
cal.set(日历.HOUR_OF_DAY, HH);
cal.set(日历.分钟,毫米);
cal.set(日历.SECOND, ss);
休息;
情况 23: // yyyy/MM/dd HH:mm:ss.SSS
HH = Integer.parseInt(strDate.substring(11, 13));
mm = Integer.parseInt(strDate.substring(14, 16));
ss = Integer.parseInt(strDate.substring(17, 19));
SSS = Integer.parseInt(strDate.substring(20, 23));
cal.set(日历.HOUR_OF_DAY, HH);
cal.set(日历.分钟,毫米);
cal.set(日历.SECOND, ss);
cal.set(日历.MILLISECOND, SSS);
休息;
默认:
抛出新的 IllegalStateException(
“此 String 字符串无法转换为日期字符串:”
+ strDate);
}
返回校准;
}
/**
* 任何日期字符串“yyyy/MM/dd”或“yyyy/MM/dd HH:mm:ss”
* 尝试转换为格式。
* 示例:03/1/3 ⇒ 2003/01/03
* @参数strDate
* @返回
*/
私有静态字符串格式(字符串strDate){
strDate = strDate.trim();
字符串 yyyy = null;
字符串 MM = null;
字符串 dd = null;
字符串 HH = null;
字符串毫米=空;
字符串 ss = null;
字符串 SSS = null;
// 如果缺少“-”或“/”
if (strDate.indexOf(“/”) == -1 && strDate.indexOf(“-”) == -1) {
if (strDate.length() == 8) {
yyyy = strDate.substring(0, 4);
MM = strDate.substring(4, 6);
dd = strDate.substring(6, 8);
返回 yyyy + “/” + MM + “/” + dd;
} 别的 {
yyyy = strDate.substring(0, 4);
MM = strDate.substring(4, 6);
dd = strDate.substring(6, 8);
HH = strDate.substring(9, 11);
mm = strDate.substring(12, 14);
ss = strDate.substring(15, 17);
返回 yyyy + “/” + MM + “/” + dd + “ ” + HH + “:” + mm + “:”
+SS;
}
}
StringTokenizer token = new StringTokenizer(strDate, “_/-:. “);
StringBuffer 结果 = new StringBuffer();
for (int i = 0; token.hasMoreTokens(); i++) {
字符串 temp = token.nextToken();
开关(一){
case 0:// 年份部分
yyyy = fillString(strDate, temp, “f”, “20”, 4);
结果.append(yyyy);
休息;
案例 1:// 月份部分
MM = fillString(strDate, temp, “f”, “0”, 2);
结果.append(“/” + MM);
休息;
案例 2:// 日间时段
dd = fillString(strDate, temp, “f”, “0”, 2);
结果.append(“/” + dd);
休息;
案例3://时间部分
HH = fillString(strDate, temp, “f”, “0”, 2);
结果.append(” ” + HH);
休息;
案例 4:// 分钟部分
mm = fillString(strDate, temp, “f”, “0”, 2);
结果.append(“:”+mm);
休息;
案例5://第二部分
ss = fillString(strDate, temp, “f”, “0”, 2);
结果.append(“:”+ ss);
休息;
case 6:// 毫秒部分
SSS = fillString(strDate, temp, “b”, “0”, 3);
结果.append(“.” + SSS);
休息;
}
}
返回结果.toString();
}
私有静态字符串 fillString(字符串 strDate, 字符串 str,
字符串位置,字符串 addStr,int len) {
if (str.length() > len) {
String mes = strDate + “该String字符串无法转换为日期字符串”;
抛出新的 IllegalStateException(mes);
}
返回 fillString(str, 位置, addStr, len);
}
/**
* 将要添加的字符串[addStr]添加到[len]中[position]处的字符串[str]中
* 插入直至满。
* <p>
* 示例:String ss = StringUtil.fillString(“aaa”,”b”,”0″,7); ss ⇒ “aaa0000”
*
* *fillString() 插入直到 len 被填满,但是 addString() 插入 len。
*
* @param str 目标字符串
* @param 位置 在 ⇒ F/f 之前插入 ⇒ B/b 之后插入
* @param addStr 要插入的字符串
* @param len 要补充的位数
* @return 转换后的字符串。 [str] 为 null 或空文字,[addStr] 设置为 [len]
* 返回插入的结果,直到满意为止。
*/
私有静态字符串 fillString(字符串 str, 字符串位置,
字符串 addStr, int len) {
StringBuffer 临时缓冲区 = null;
if (!isExist(str)) {
tempBuffer = 新的 StringBuffer();
for (int i = 0; i < len; i++) {
tempBuffer.append(addStr);
}
返回 tempBuffer.toString();
} else if (str.length() != len) {
tempBuffer = 新的 StringBuffer(str);
while (len > tempBuffer.length()) {
if (position.equalsIgnoreCase(“f”)) {
tempBuffer.insert(0, addStr);
} 别的 {
tempBuffer.append(addStr);
}
}
返回 tempBuffer.toString();
}
返回字符串;
}
}