package cn.pde.utils;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
public class ReflectUtil {
public static Map<String,Annotation[]> getFieldNameAndAnnatationsMap(Class clazz) {
Map<String,Annotation[]> ret = new HashMap<String, Annotation[]>();
Field[] fields = clazz.getDeclaredFields();
for(Field field : fields) {
ret.put(field.getName(), field.getAnnotations());
}
return ret;
}
public static Map<String,Annotation> getFieldNameAndAnnotationMap(Class clazz,Class annoClass) {
Map<String,Annotation> ret = new HashMap<String, Annotation>();
Field[] fields = clazz.getDeclaredFields();
for(Field field : fields) {
ret.put(field.getName(), field.getAnnotation(annoClass));
}
return ret;
}
public static Annotation getObjAnnotation(Class objClass,Class annoClass) {
return objClass.getAnnotation(annoClass);
}
/**
* 获取类成员变量相应注解的变量值
* eg: ReflectUtil.getAnnoFieldValue(OrgInfo.class, "parent", Column.class, "name")
* 的作用为:获取OrgInfo类中parent变量的@Column注解中的name属性值
* @param objClass
* @param objFieldName
* @param annoClass
* @param annoFieldName
* @return
*/
public static Object getAnnoFieldValue(Class<?> objClass,String objFieldName,Class<?> annoClass, String annoFieldName) {
Object ret = null;
Map<String,Annotation> fieldNameAndAnnatationMap = getFieldNameAndAnnotationMap(objClass, annoClass);
Annotation anno = fieldNameAndAnnatationMap.get(objFieldName);
if(anno != null) {
try {
Method method = annoClass.getMethod(annoFieldName); //Annotation中的成员变量以方法的形式来定义
ret = method.invoke(anno);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
return ret;
}
/**
* 获取对象实例中成员变量值(包含父类)
* @param obj 对象实例
* @param fieldName 变量名
* @return
*/
public static Object getFieldValue(Object obj, String fieldName) {
Object ret = null;
Field field = getField(obj.getClass(), fieldName);
if(field != null) {
field.setAccessible(true);
try {
ret = field.get(obj);
} catch (Exception e) {
e.printStackTrace();
}
}
return ret;
}
/*
* 获取类属性(包含父类)
*/
public static Field getField(Class<?> clazz, String fieldName) {
Field ret = null;
if (clazz != null && !StringUtils.isBlank(fieldName)) {
try {
fieldName = fieldName.trim();
ret = clazz.getDeclaredField(fieldName);
} catch (Exception e) {//如没找到,则从父类继续查找
ret = getField(clazz.getSuperclass(), fieldName);
}
}
return ret;
}
}
分享到:
相关推荐
java的泛型和反射机制一直很难理解和应用,这个程序是关于反射和泛型的综合使用,主要实现获取一个类的属性名和方法,并可以获取属性值,存取属性值,属性名和属性值的字符串方式输出。只是个工具类,没有写测试类,...
一个Java反射工具类,可以完成查询字段值以及设置字段值的功能。
NULL 博文链接:https://frank-zeng.iteye.com/blog/1153705
NULL 博文链接:https://1017401036.iteye.com/blog/2343706
java获取图片的EXIF信息,其中包括 反射机制
该代码经过作者的优化,可直接使用,反射一个实体,从试题中获取值
Java反射技术指的是在运行时动态地获取类的信息、调用对象的方法、操作类的属性等能力。通过反射,程序可以在运行时检查类、实例化对象、调用方法、获取和设置属性,甚至可以动态修改类的结构。 Java反射技术的核心...
利用反射机制动态获取对象属性名称及数据类型 利用反射机制动态获取对象属性名称及数据类型 利用反射机制动态获取对象属性名称及数据类型 利用反射机制动态获取对象属性名称及数据类型 利用反射机制动态获取对象属性...
NULL 博文链接:https://747017186.iteye.com/blog/1935184
NULL 博文链接:https://bijian1013.iteye.com/blog/2299135
本Demo是Servlet 拿过去既可以导入运行,主要知识点是缓存管理,通过反射机制获取对象,有一种工厂设计模式在里面,缓存工具类采用的是单例模式.
NULL 博文链接:https://1017401036.iteye.com/blog/2343705
当我们声明了一个泛型的接口或类,或需要一个子类继承至这个泛型类,而我们又希望利用反射获取这些泛型参数信息。这是本文将要介绍的ReflectionUtil是为了解决这类问题的辅助工具类,为java.lang.reflect标准库的...
DumpMethods.java 使用反射机制来获取类中的方法 getClassName.java 利用反射机制获取类的名字 invokeConstructor.java 利用反射机制调用构造器 invokeMethod.java 利用反射机制调用成员方法 listConstructors....
java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java....
java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio ...
8.利用反射机制进行排序工具类,支持数组、List、Set、Map的排序,可以支持多属性排序,支持子对象中的属性排序(例user对象中的role的name属性进行排序,method="role.name") 9.JVM参数获取工具 10.Java对象比较、...
解析字符串转化为对象+code转desc+通过值实例枚举类+EnumUtil+PackageUtils工具类 ZipInputStream实现压缩文件的读取与数据转化的过程,利用反射实现根据枚举值获取枚举对象。
ReflectUtils 反射工具类,提供一些Java基本的反射功能 RegexUtils 正则表达式工具类,提供一些常用的正则表达式 SDCardUtils SD卡工具箱 Symbols 常用符号 WebViewManager WebView管理器,提供常用设置 原地址:...
通过枚举反向给实体类赋值工具类,减少表单提交时通过request.getParameter(name)方式获取提交值的重复操作