反射工具类

常用的反射工具类ReflectionExtUtil.util


package com.gbcom.system.utils;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.log4j.Logger;

/**
* 反射工具栏
*
* @author syz
* @date 2014-5-8
* @version v1.0.0
* @see com.gbcom.dp.reflection.ReflectionExtUtil
*/
public class ReflectionExtUtil {

private static final Logger LOG = Logger.getLogger(ReflectionExtUtil.class);

/**
* 新建实例,要么不写构造函数,否则必须有一个默认构造函数
*
* @param className
* 类名
* @param args
* 构造函数的参数
* @return 新建的实例
* @throws Exception
* Exception
*/
public static Object newInstance(String className, Object[] args)
throws Exception {
Class newoneClass = Class.forName(className);
if (args == null) {
return newoneClass.newInstance();
}
Class[] argsClass = new Class[args.length];

for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}

Constructor cons = newoneClass.getConstructor(argsClass);

return cons.newInstance(args);

}

/**
* 是不是某个类的实例
*
* @param obj
* 实例
* @param cls
* 类
* @return 如果 obj 是此类的实例,则返回 true
*/
public static boolean isInstance(Object obj, Class cls) {
return cls.isInstance(obj);
}

/**
* 循环向上转型, 获取对象的 DeclaredMethod
*
* @param object
* : 子类对象
* @param methodName
* : 父类中的方法名
* @param parameterTypes
* : 父类中的方法参数类型
* @return 父类中的方法对象
*/

public static Method getDeclaredMethod(Object object, String methodName,
Class<?>... parameterTypes) {
Method method = null;

for (Class<?> clazz = object.getClass(); clazz != Object.class; clazz = clazz
.getSuperclass()) {
try {
method = clazz.getDeclaredMethod(methodName, parameterTypes);
return method;
} catch (Exception e) {
// 这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。
// 如果这里的异常打印或者往外抛,则就不会执行clazz =
// clazz.getSuperclass(),最后就不会进入到父类中了

}
}

return null;
}

/**
* 直接调用对象方法, 而忽略修饰符(private, protected, default)
*
* @param object
* : 子类对象
* @param methodName
* : 父类中的方法名
* @param parameterTypes
* : 父类中的方法参数类型
* @param parameters
* : 父类中的方法参数
* @return 父类中方法的执行结果
*/

public static Object invokeMethod(Object object, String methodName,
Class<?>[] parameterTypes, Object[] parameters) {
// 根据 对象、方法名和对应的方法参数 通过反射 调用上面的方法获取 Method 对象
Method method = getDeclaredMethod(object, methodName, parameterTypes);

// 抑制Java对方法进行检查,主要是针对私有方法而言
method.setAccessible(true);

try {
if (null != method) {

// 调用object 的 method 所代表的方法,其方法的参数是 parameters
return method.invoke(object, parameters);
}
} catch (IllegalArgumentException e) {
LOG.error("error",e);
} catch (IllegalAccessException e) {
LOG.error("error",e);
} catch (InvocationTargetException e) {
LOG.error("error",e);
}

return null;
}

private static Field[] arryConcat(Field[] a, Field[] b) {
Field[] c = new Field[a.length + b.length];
System.arraycopy(a, 0, c, 0, a.length);
System.arraycopy(b, 0, c, a.length, b.length);
return c;
}

private static Method[] arryConcat(Method[] a, Method[] b) {
Method[] c = new Method[a.length + b.length];
System.arraycopy(a, 0, c, 0, a.length);
System.arraycopy(b, 0, c, a.length, b.length);
return c;
}

/**
* 获取对象的所有属性,包括父类
*
* @param object
* Object
* @return Field []
*/
public static Field[] getDeclaredFields(Object object) {
Class<?> clazz = object.getClass();
Field[] total = new Field[0];
for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
total = (Field[]) arryConcat(total, clazz.getDeclaredFields());
}
return total;
}

/**
* 获取对象的所有属性,包括父类
*
* @param clazz
* Class<?>
* @return Field []
*/
public static Field[] getDeclaredFields(Class<?> clazz) {
Field[] total = new Field[0];
for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
total = (Field[]) arryConcat(total, clazz.getDeclaredFields());
}
return total;
}

/**
* 获取对象的所有方法
*
* @param object
* Object
* @return Method []
*/
public static Method[] getDeclaredMethods(Object object) {
Class<?> clazz = object.getClass();
Method[] total = new Method[0];
for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
total = (Method[]) arryConcat(total, clazz.getDeclaredMethods());
}
return total;
}

/**
* 循环向上转型, 获取对象的 DeclaredField
*
* @param object
* : 子类对象
* @param fieldName
* : 父类中的属性名
* @return 父类中的属性对象
*/

public static Field getDeclaredField(Object object, String fieldName) {
Field field = null;

Class<?> clazz = object.getClass();

for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
try {
field = clazz.getDeclaredField(fieldName);
return field;
} catch (Exception e) {
}
}

return null;
}

/**
* 直接设置对象属性值, 忽略 private/protected 修饰符, 也不经过 setter
*
* @param object
* : 子类对象
* @param fieldName
* : 父类中的属性名
* @param value
* : 将要设置的值
*/

public static void setFieldValue(Object object, String fieldName,
Object value) {

// 根据 对象和属性名通过反射 调用上面的方法获取 Field对象
Field field = getDeclaredField(object, fieldName);

// 抑制Java对其的检查
field.setAccessible(true);

try {
// 将 object 中 field 所代表的值 设置为 value
field.set(object, value);
} catch (IllegalArgumentException e) {
LOG.error("error",e);
} catch (IllegalAccessException e) {
LOG.error("error",e);
}

}

/**
* 直接读取对象的属性值, 忽略 private/protected 修饰符, 也不经过 getter
*
* @param object
* : 子类对象
* @param fieldName
* : 父类中的属性名
* @return : 父类中的属性值
*/

public static Object getFieldValue(Object object, String fieldName) {

// 根据 对象和属性名通过反射 调用上面的方法获取 Field对象
Field field = getDeclaredField(object, fieldName);

// 抑制Java对其的检查
field.setAccessible(true);

try {
// 获取 object 中 field 所代表的属性值
return field.get(object);

} catch (Exception e) {
LOG.error("error",e);
}

return null;
}

/**
* 设置属性值
*
* @param list
* ArrayList
* @param cla
* Class
* @return ArrayList
*/
@SuppressWarnings("unchecked")
public static ArrayList array2bean(ArrayList list, Class cla) {
ArrayList result = new ArrayList();
int filedLen = cla.getDeclaredFields().length;
System.out.println(":" + cla.getDeclaredFields().length);
for (int i = 0; i < list.size(); i++) {
Object[] o = (Object[]) list.get(i);
int length = filedLen < o.length ? filedLen : o.length;
try {
result.add(cla.newInstance());
for (int j = 0; j < length; j++) {
Method m = null;
String mName = cla.getDeclaredFields()[j].getName();
mName = mName.substring(0, 1).toUpperCase()
+ mName.substring(1);
mName = "set" + mName;
m = cla.getMethod(mName, new Class[] { String.class });
// 调用设置的方法,给属性赋值
m.invoke(result.get(i), new Object[] { o[j] == null ? ""
: o[j].toString() });
}
} catch (Exception e) {
LOG.error("error",e);
}
}
return result;
}

/**
*
* @param cla
* String
* @param attri
* Class
* @return Class
*/
public static Class getAttriTypeByName(Class cla, String attri) {
Field[] fds = getDeclaredFields(cla);
for (Field field : fds) {
if (field.getName().equals(attri)) {
return field.getType();
}
}
return String.class;
}

/**
* 获取对象的所有属性的 valueMap
*
* @param obj
* Object
* @return Map<String, Object>
* @throws SecurityException
* SecurityException
* @throws NoSuchMethodException
* NoSuchMethodException
* @throws IllegalArgumentException
* IllegalArgumentException
* @throws IllegalAccessException
* IllegalAccessException
* @throws InvocationTargetException
* InvocationTargetException
*/
public static Map<String, Object> getAttrsValueMap(Object obj)
throws SecurityException, NoSuchMethodException,
IllegalArgumentException, IllegalAccessException,
InvocationTargetException {
Map<String, Object> valueMap = new HashMap<String, Object>();
Class cla = obj.getClass();
Field[] fds = getDeclaredFields(obj);
Field field = null;
String fieldName = null;
String methodName = null;
Method method = null;
Object returnValue = null;
for (int i = 0; i < fds.length; i++) {
field = fds[i];
fieldName = field.getName();
methodName = "get" + fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
method = getDeclaredMethod(obj, methodName, null);
if (method == null) {
methodName = "is" + fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
method = getDeclaredMethod(obj, methodName, null);
}
if (method == null) {
System.out
.println("NullPoint exception , of reflection methodName="
+ methodName);
continue;
}
returnValue = method.invoke(obj, null);// 调用方法,相当于执行get方法得到的结果,这里返回的是一个对象
valueMap.put(fieldName, returnValue == null ? "" : returnValue);
}

return valueMap;
}

/**
* 根据MAP 设置对象的所有属性,
*
* @param obj
* Object
* @param valueMap
* Map<String, Object>
* @throws NoSuchMethodException
* NoSuchMethodException
* @throws SecurityException
* SecurityException
* @throws InvocationTargetException
* InvocationTargetException
* @throws IllegalAccessException
* IllegalAccessException
* @throws IllegalArgumentException
* IllegalArgumentException
*/
public static void setAttrsValueMap(Object obj, Map<String, Object> valueMap)
throws SecurityException, NoSuchMethodException,
IllegalArgumentException, IllegalAccessException,
InvocationTargetException {
Class cla = obj.getClass();

String fieldName = null;
String methodName = null;
Method method = null;
for (Entry<String, Object> entry : valueMap.entrySet()) {
// 预判断
if (entry.getValue() == null
|| String.valueOf(entry.getValue()).startsWith("noSuch")) {
continue;
}
fieldName = entry.getKey();
if (fieldName.equals("staticChannel")) {
System.out.println("xxx");
}
methodName = "set" + fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
Class type = entry.getValue().getClass();
if (type == Integer.class) {
type = int.class;
} else if (type == Boolean.class) {
type = boolean.class;
}
// Object varObj = convertClxValue(type, entry.getValue());
method = getDeclaredMethod(obj, methodName, type);
// if(method == null){
// type = int.class;
// method = getDeclaredMethod(obj,methodName, type);
// }
if (method == null) {
System.out
.println("NullPoint exception , of reflection methodName="
+ methodName);
continue;
}
method.invoke(obj, entry.getValue());// 调用方法,set操作注意
}
}

private static Object convertClxValue(Object value) {
if (value instanceof String) {
return String.valueOf(value);
}
return null;
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hutool是一个Java工具包,其中包含了众多的工具类,方便开发者进行各种操作。其中,Hutool也提供了反射(Reflection)工具类,用于在运行时获取类的信息以及对类进行操作。 Hutool的反射工具类提供了一系列方法,可用于获取类的信息,如获取类的名称、包名、修饰符、父类、实现的接口等。通过这些方法,开发者可以在程序运行时动态地获取类的属性和方法列表,进而实现一些动态的操作。例如,在进行对象赋值或属性拷贝时,我们可以使用反射工具类获取目标对象和源对象的属性列表,然后通过反射设置值,从而实现属性的赋值或拷贝。 此外,Hutool的反射工具类还提供了许多其他的反射操作方法,如创建实例、调用方法、获取或设置字段值等。通过这些方法,我们可以在运行时动态地创建对象、调用对象的方法或修改对象的字段值。这为开发者提供了很大的灵活性,可以根据需要动态地进行对象的创建、方法的调用以及字段的修改。 总之,Hutool的反射工具类是一个非常实用的工具,可以方便地获取类的信息并进行动态的操作。使用Hutool的反射工具类,开发者可以减少大量的重复性代码,提高代码的灵活性和可维护性。无论是进行对象赋值、属性拷贝,还是动态地创建对象、调用方法,Hutool的反射工具类都能为开发者提供便利,并极大地提升开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值