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;
}
}
分享到:
相关推荐
1. **获取枚举类**:要通过反射获取枚举类,首先需要得到其Class对象。这可以通过`Class.forName()`方法完成,提供枚举类的全限定名作为参数。 ```java Class<Color> colorClass = (Class) Class.forName(...
接下来,我们将通过一个具体的例子来演示如何使用Java反射获取内部类的静态成员变量的值。 ##### 示例代码分析 假设我们有如下的类结构: ```java public class Goods { static class Apple { // 内部类 public ...
Java反射调用是Java语言提供的一种强大的动态类型机制,它允许程序在运行时检查并使用类的信息,包括类的方法、属性以及构造器等。在Java中,反射是通过`java.lang.reflect`包中的类实现的,如`Class`、`Constructor...
java的泛型和反射机制一直很难理解和应用,这个程序是关于反射和泛型的综合使用,主要实现获取一个类的属性名和方法,并可以获取属性值,存取属性值,属性名和属性值的字符串方式输出。只是个工具类,没有写测试类,...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法的信息。这个特性使得Java具备了高度的灵活性,能够在运行时动态地发现和使用类的属性和方法,即使这些信息在编译时...
尽管Java反射不直接支持泛型信息,但可以通过方法签名或字段类型来间接获取。例如,`List<?>`的`Class`类型是`java.util.List`,这意味着你不能直接获取泛型的实际类型参数。然而,你可以通过类型检查和转换来操作...
一旦有了Class对象,我们就可以通过它来获取类的构造器、方法、字段等信息。对于题目中的需求,获取特定方法,我们可以使用`getMethods()`或者`getMethod(String name, Class<?>... parameterTypes)`方法。 `...
提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/...
一个Java反射工具类,可以完成查询字段值以及设置字段值的功能。
在标题和描述中提到的知识点主要集中在如何通过反射获取类的所有属性和get方法,包括来自子类和父类的。下面将详细介绍这些内容。 1. **获取所有属性**: 在Java中,`java.lang.Class` 类提供了获取类属性的方法。...
在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段以及方法的信息。通过反射,开发者可以动态地创建对象、调用方法、访问字段,甚至修改类的行为。这个过程通常...
Java的类反射是Java语言中一个强大的特性,它允许程序在运行时检查并操作类、接口、字段和方法的信息。这种动态类型的能力使得Java代码能够更加灵活,可以处理未知类型的对象,实现元编程,以及在运行时创建和访问类...
在本教程中,我们将深入探讨如何通过反射获取实体类的属性、方法、接口以及父类信息。 首先,让我们从`Person.java`这个实体类开始。在Java中,实体类通常用于表示数据对象,比如一个用户或者订单。实体类可能包含...
Java反射工具类ReflectionUtils是Java开发中常用的一个辅助类,它可以帮助开发者在运行时检查类、接口、字段和方法的信息,以及动态调用方法和访问字段。反射在Java编程中扮演着重要的角色,特别是在框架开发、插件...
Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。...
Java反射工具类主要指的是`java.lang.reflect`包中的类,它们提供了对类、接口、字段和方法的动态访问能力。这篇博文通过链接可能详细解释了如何利用这些工具类来实现一些高级功能。 1. `Class<?>`: 这是反射的核心...
在本篇中,我们将深入探讨如何通过反射获取类的实例,以及相关的源码分析。 首先,我们需要了解`java.lang.Class`类。它是Java中的一个核心类,代表运行时的类信息。我们可以通过以下几种方式获取`Class`对象: 1....
Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有了高度的灵活性,常用于框架开发、插件系统、元编程等...
在Java中,反射是一种强大的工具,允许我们在运行时检查类、接口、字段和方法的信息,甚至可以在不知道其具体类型的情况下动态调用方法或访问字段。在Android环境下,我们可以利用反射来访问那些非公开或隐藏的API,...
Java反射技术是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个技术主要基于Java.lang.reflect包中的类和接口,如Class、Constructor、Method和Field等。...