反射工具类【ReflectionUtils】
反射工具类【ReflectionUtils】
原创
2017年05月05日 00:45:43
<ul class="article_tags clearfix csdn-tracking-statistics" data-mod="popu_377">
<li class="tit">标签:</li>
<li><a href="http://so.csdn.net/so/search/s.do?q=java&t=blog" target="_blank">java</a> <span>/</span></li>
<li><a href="http://so.csdn.net/so/search/s.do?q=反射&t=blog" target="_blank">反射</a> <span>/</span></li>
<li><a href="http://so.csdn.net/so/search/s.do?q=reflection&t=blog" target="_blank">reflection</a> <span style="display: none;">/</span></li>
<!-- [endarticletags]-->
</ul>
<ul class="right_bar">
<li><button class="btn-noborder"><i class="icon iconfont icon-read"></i><span class="txt">893</span></button></li>
<li class="edit" style="display: none;">
<a class="btn-noborder" href="http://write.blog.csdn.net/postedit/71190114">
<i class="icon iconfont icon-bianji"></i><span class="txt">编辑</span>
</a>
</li>
<li class="del" style="display: none;">
<a class="btn-noborder" onclick="javascript:deleteArticle(fileName);return false;">
<i class="icon iconfont icon-shanchu"></i><span class="txt">删除</span>
</a>
</li>
</ul>
</div>
<div id="article_content" class="article_content csdn-tracking-statistics" data-mod="popu_519" data-dsm="post" style="overflow: hidden;">
<pre><code>import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
/**
- 反射工具类 <br />
- <br />
- 提供了一系列的获取某一个类的信息的方法<br />
- 包括获取全类名,实现的接口,接口的泛型等<br />
- 并且提供了根据Class类型获取对应的实例对象的方法,以及修改属性和调用对象的方法等
*/
public class ReflectionUtils {
/**
- 获取包名
- @return 包名【String类型】
*/
public static String getPackage(Class<?> clazz) {
Package pck = clazz.getPackage();
if (null != pck) {
return pck.getName();
} else {
return "没有包!";
}
}
/**
- 获取继承的父类的全类名
- @return 继承的父类的全类名【String类型】
*/
public static String getSuperClassName(Class<?> clazz) {
Class<?> superClass = clazz.getSuperclass();
if (null != superClass) {
return superClass.getName();
} else {
return "没有父类!";
}
}
/**
- 获取全类名
- @return 全类名【String类型】
*/
public static String getClassName(Class<?> clazz) {
return clazz.getName();
}
/**
获取实现的接口名
@return 所有的接口名【每一个接口名的类型为String,最后保存到一个List集合中】
*/
public static List<String> getInterfaces(Class<?> clazz) {
Class<?>[] interfaces = clazz.getInterfaces();
int len = interfaces.length;List<String> list = new ArrayList<String>();
for (int i = 0; i < len; i++) {
Class<?> itfc = interfaces[i];// 接口名
String interfaceName = itfc.getSimpleName(); list.add(interfaceName);
}
return list;
}
/**
获取所有属性
@return 所有的属性【每一个属性添加到StringBuilder中,最后保存到一个List集合中】
*/
public static List<StringBuilder> getFields(Class<?> clazz) {
Field[] fields = clazz.getDeclaredFields();
int len = fields.length;List<StringBuilder> list = new ArrayList<StringBuilder>();
StringBuilder sb = null;
for (int i = 0; i < len; i++) {
Field field = fields[i];
sb = new StringBuilder();// 修饰符
String modifier = Modifier.toString(field.getModifiers());
sb.append(modifier + " "); // 数据类型
Class<?> type = field.getType();
String typeName = type.getSimpleName();
sb.append(typeName + " "); // 属性名
String fieldName = field.getName();
sb.append(fieldName + ";"); list.add(sb);
}
return list;
}
/**
获取所有公共的属性
@return 所有公共的属性【每一个属性添加到StringBuilder中,最后保存到一个List集合中】
*/
public static List<StringBuilder> getPublicFields(Class<?> clazz) {
Field[] fields = clazz.getFields();
int len = fields.length;List<StringBuilder> list = new ArrayList<StringBuilder>();
StringBuilder sb = null;
for (int i = 0; i < len; i++) {
Field field = fields[i];
sb = new StringBuilder();// 修饰符
String modifier = Modifier.toString(field.getModifiers());
sb.append(modifier + " "); // 数据类型
Class<?> type = field.getType();
String typeName = type.getSimpleName();
sb.append(typeName + " "); // 属性名
String fieldName = field.getName();
sb.append(fieldName + ";"); list.add(sb);
}
return list;
}
/**
获取所有构造方法
@return 所有的构造方法【每一个构造方法添加到StringBuilder中,最后保存到一个List集合中】
*/
public static List<StringBuilder> getConstructors(Class<?> clazz) {
Constructor<?>[] constructors = clazz.getDeclaredConstructors();
int len = constructors.length;List<StringBuilder> list = new ArrayList<StringBuilder>();
StringBuilder sb = null;
for (int i = 0; i < len; i++) {
Constructor<?> constructor = constructors[i];
sb = new StringBuilder();// 修饰符
String modifier = Modifier.toString(constructor.getModifiers());
sb.append(modifier + " "); // 方法名(类名)
String constructorName = clazz.getSimpleName();
sb.append(constructorName + " ("); // 形参列表
Class<?>[] parameterTypes = constructor.getParameterTypes();
int length = parameterTypes.length;
for (int j = 0; j < length; j++) {
Class<?> parameterType = parameterTypes[j]; String parameterTypeName = parameterType.getSimpleName(); if (j < length - 1) {
sb.append(parameterTypeName + ", ");
} else {
sb.append(parameterTypeName);
} } sb.append(") {}"); list.add(sb);
}
return list;
}
/**
获取所有自身的方法
@return 所有自身的方法【每一个方法添加到StringBuilder中,最后保存到一个List集合中】
*/
public static List<StringBuilder> getMethods(Class<?> clazz) {
Method[] methods = clazz.getDeclaredMethods();
int len = methods.length;List<StringBuilder> list = new ArrayList<StringBuilder>();
StringBuilder sb = null;
for (int i = 0; i < len; i++) {
Method method = methods[i];
sb = new StringBuilder();// 修饰符
String modifier = Modifier.toString(method.getModifiers());
sb.append(modifier + " "); // 返回值类型
Class<?> returnClass = method.getReturnType();
String returnType = returnClass.getSimpleName();
sb.append(returnType + " "); // 方法名
String methodName = method.getName();
sb.append(methodName + " ("); // 形参列表
Class<?>[] parameterTypes = method.getParameterTypes();
int length = parameterTypes.length; for (int j = 0; j < length; j++) {
Class<?> parameterType = parameterTypes[j]; // 形参类型
String parameterTypeName = parameterType.getSimpleName(); if (j < length - 1) {
sb.append(parameterTypeName + ", ");
} else {
sb.append(parameterTypeName);
} } sb.append(") {}"); list.add(sb);
}
return list;
}
/**
获取所有公共的方法
@return 所有公共的方法【每一个方法添加到StringBuilder中,最后保存到一个List集合中】
*/
public static List<StringBuilder> getPublicMethods(Class<?> clazz) {
Method[] methods = clazz.getMethods();
int len = methods.length;List<StringBuilder> list = new ArrayList<StringBuilder>();
StringBuilder sb = null;
for (int i = 0; i < len; i++) {
Method method = methods[i];
sb = new StringBuilder();// 修饰符
String modifier = Modifier.toString(method.getModifiers());
sb.append(modifier + " "); // 返回值类型
Class<?> returnClass = method.getReturnType();
String returnType = returnClass.getSimpleName();
sb.append(returnType + " "); // 方法名
String methodName = method.getName();
sb.append(methodName + " ("); // 形参列表
Class<?>[] parameterTypes = method.getParameterTypes();
int length = parameterTypes.length; for (int j = 0; j < length; j++) {
Class<?> parameterType = parameterTypes[j]; // 形参类型
String parameterTypeName = parameterType.getSimpleName(); if (j < length - 1) {
sb.append(parameterTypeName + ", ");
} else {
sb.append(parameterTypeName);
} } sb.append(") {}"); list.add(sb);
}
return list;
}
/**
获取所有的注解名
@return 所有的注解名【每一个注解名的类型为String,最后保存到一个List集合中】
*/
public static List<String> getAnnotations(Class<?> clazz) {
Annotation[] annotations = clazz.getAnnotations();
int len = annotations.length;List<String> list = new ArrayList<String>();
for (int i = 0; i < len; i++) {
Annotation annotation = annotations[i];String annotationName = annotation.annotationType().getSimpleName();
list.add(annotationName);
}
return list;
}
/**
获取父类的泛型
@return 父类的泛型【Class类型】
*/
public static Class<?> getSuperClassGenericParameterizedType(Class<?> clazz) {
Type genericSuperClass = clazz.getGenericSuperclass();Class<?> superClassGenericParameterizedType = null;
// 判断父类是否有泛型
if (genericSuperClass instanceof ParameterizedType) {
// 向下转型,以便调用方法
ParameterizedType pt = (ParameterizedType) genericSuperClass;
// 只取第一个,因为一个类只能继承一个父类
Type superClazz = pt.getActualTypeArguments()[0];
// 转换为Class类型
superClassGenericParameterizedType = (Class<?>) superClazz;
}return superClassGenericParameterizedType;
}
/**
获取接口的所有泛型
@return 所有的泛型接口【每一个泛型接口的类型为Class,最后保存到一个List集合中】
*/
public static List<Class<?>> getInterfaceGenericParameterizedTypes(Class<?> clazz) {
Type[] genericInterfaces = clazz.getGenericInterfaces();
int len = genericInterfaces.length;List<Class<?>> list = new ArrayList<Class<?>>();
for (int i = 0; i < len; i++) {
Type genericInterface = genericInterfaces[i];// 判断接口是否有泛型
if (genericInterface instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType) genericInterface; // 得到所有的泛型【Type类型的数组】
Type[] interfaceTypes = pt.getActualTypeArguments(); int length = interfaceTypes.length; for (int j = 0; j < length; j++) {
// 获取对应的泛型【Type类型】
Type interfaceType = interfaceTypes[j];
// 转换为Class类型
Class<?> interfaceClass = (Class<?>) interfaceType;
list.add(interfaceClass);
} }
}
return list;
}
/**
- 打印包名
*/
public static void printPackage(Class<?> clazz) {
System.out.println(getPackage(clazz));
}
/**
- 打印继承的父类的全类名
*/
public static void printSuperClassName(Class<?> clazz) {
System.out.println(getSuperClassName(clazz));
}
/**
- 打印全类名
*/
public static void printClassName(Class<?> clazz) {
System.out.println(getClassName(clazz));
}
/**
- 打印实现的接口
*/
public static void printInterfaces(Class<?> clazz) {
List<String> list = getInterfaces(clazz);
int size = list.size();
if (0 < size) {
for (int i = 0; i < size; i++) {
System.out.println(list.get(i));
}
} else {
System.out.println("没有实现接口!");
}
}
/**
- 打印所有属性
*/
public static void printFields(Class<?> clazz) {
List<StringBuilder> list = getFields(clazz);
int size = list.size();
if (0 < size) {
for (int i = 0; i < size; i++) {
System.out.println(list.get(i));
}
} else {
System.out.println("没有属性!");
}
}
/**
- 打印所有公共的属性
*/
public static void printPublicFields(Class<?> clazz) {
List<StringBuilder> list = getPublicFields(clazz);
int size = list.size();
if (0 < size) {
for (int i = 0; i < size; i++) {
System.out.println(list.get(i));
}
} else {
System.out.println("没有属性!");
}
}
/**
- 打印所有构造方法
*/
public static void printConstructors(Class<?> clazz) {
List<StringBuilder> list = getConstructors(clazz);
int size = list.size();
if (0 < size) {
for (int i = 0; i < size; i++) {
System.out.println(list.get(i));
}
} else {
System.out.println("没有构造方法!");
}
}
/**
- 打印所有方法
*/
public static void printMethods(Class<?> clazz) {
List<StringBuilder> list = getMethods(clazz);
int size = list.size();
if (0 < size) {
for (int i = 0; i < size; i++) {
System.out.println(list.get(i));
}
} else {
System.out.println("没有方法!");
}
}
/**
- 打印所有公共的方法
*/
public static void printPublicMethods(Class<?> clazz) {
List<StringBuilder> list = getPublicMethods(clazz);
int size = list.size();
if (0 < size) {
for (int i = 0; i < size; i++) {
System.out.println(list.get(i));
}
} else {
System.out.println("没有方法!");
}
}
/**
- 打印所有的注解
*/
public static void printAnnotations(Class<?> clazz) {
List<String> list = getAnnotations(clazz);
int size = list.size();
if (0 < size) {
for (int i = 0; i < size; i++) {
System.out.println(list.get(i));
}
} else {
System.out.println("没有注解!");
}
}
/**
- 打印父类的泛型名
*/
public static void printSuperClassGenericParameterizedType(Class<?> clazz) {
Class<?> superClassGenericParameterizedType = getSuperClassGenericParameterizedType(clazz);
if (null != superClassGenericParameterizedType) {
System.out.println(superClassGenericParameterizedType.getSimpleName());
} else {
System.out.println("父类没有泛型!");
}
}
/**
- 打印接口的泛型
*/
public static void printInterfaceGenericParameterizedTypes(Class<?> clazz) {
List<Class<?>> list = getInterfaceGenericParameterizedTypes(clazz);
int size = list.size();
if (0 < size) {
for (int i = 0; i < size; i++) {
System.out.println(list.get(i).getSimpleName());
}
} else {
System.out.println("没有泛型接口!");
}
}
/**
打印一个类的相关信息
@param clazz
*/
public static void printAll(Class<?> clazz) {
System.out.print("【包名】 ");
printPackage(clazz);System.out.print("【类名】 ");
System.out.println(clazz.getSimpleName());System.out.println("\n【父类全类名】");
printSuperClassName(clazz);
System.out.println("【全类名】");
printClassName(clazz);
System.out.println("\n【所有已实现的接口】");
printInterfaces(clazz);System.out.println("\n【属性】");
printFields(clazz);
System.out.println("\n【构造方法】");
printConstructors(clazz);
System.out.println("\n【方法】");
printMethods(clazz);System.out.println("\n【公共的属性】");
printPublicFields(clazz);
System.out.println("\n【公共的方法】");
printPublicMethods(clazz);
}
/**
- 根据Class类型,获取对应的实例【要求必须有无参的构造器】
- @return 对应的实例【Object类型】
*/
public static Object getNewInstance(Class<?> clazz) throws InstantiationException, IllegalAccessException {
return clazz.newInstance();
}
/**
- 根据传入的类的Class对象,以及构造方法的形参的Class对象,获取对应的构造方法对象
- @param clazz
类的Class对象
- @param parameterTypes
构造方法的形参的Class对象【可以不写】
- @return 构造方法对象【Constructor类型】
*/
public static Constructor<?> getConstructor(Class<?> clazz, Class<?>... parameterTypes)
throws NoSuchMethodException, SecurityException {
return clazz.getDeclaredConstructor(parameterTypes);
}
/**
- 根据传入的构造方法对象,以及,获取对应的实例
- @param constructor
构造方法对象
- @param initargs
传入构造方法的实参【可以不写】
- @return 对应的实例【Object类型】
*/
public static Object getNewInstance(Constructor<?> constructor, Object... initargs)
throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
constructor.setAccessible(true);
return constructor.newInstance(initargs);
}
/**
- 根据传入的属性名字符串,修改对应的属性值
- @param clazz
类的Class对象
- @param name
属性名
- @param obj
要修改的实例对象
- @param value
修改后的新值
*/
public static void setField(Class<?> clazz, String name, Object obj, Object value)
throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
Field field = clazz.getDeclaredField(name);
field.setAccessible(true);
field.set(obj, value);
}
/**
- 根据传入的方法名字符串,获取对应的方法
- @param clazz
类的Class对象
- @param name
方法名
- @param parameterTypes
方法的形参对应的Class类型【可以不写】
- @return 方法对象【Method类型】
*/
public static Method getMethod(Class<?> clazz, String name, Class<?>... parameterTypes)
throws NoSuchMethodException, SecurityException {
return clazz.getDeclaredMethod(name, parameterTypes);
}
/**
- 根据传入的方法对象,调用对应的方法
- @param method
方法对象
- @param obj
要调用的实例对象【如果是调用静态方法,则可以传入null】
- @param args
传入方法的实参【可以不写】
- @return 方法的返回值【没有返回值,则返回null】
*/
public static Object invokeMethod(Method method, Object obj, Object... args)
throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
method.setAccessible(true);
return method.invoke(obj, args);
}
}
反射工具类【ReflectionUtils】的更多相关文章
- java反射工具类
package com.yingchao.kgou.core; import java.lang.reflect.Field; import java.lang.reflect.InvocationT ...
- 反射工具类——ReflectUtils
测试方法:根据已知的方法名,来反射调用方法 package com.redmoon.forum.job; import java.util.ArrayList; import java.util.Li ...
- 反射工具类.提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,被AOP过的真实类等工具函数.java
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.ap ...
- Java 反射工具类封装
封装了常用的反射相关方法 public class ReflectUtil { /** * 通过类路径获取Class * * @author LHY <br> * Description ...
- Atitit apache 和guava的反射工具
Atitit apache 和guava的反射工具 apache1 Spring的反射工具类 ReflectionUtils1 Guava 反射工具2 apache 34 7 ...
- java使用注解和反射打造一个简单的jdbc工具类
a simple jdbc tools 如有转载和引用,请注明出处,谢谢 1. 定义我们需要的注解 要想实现对数据库的操作,我们必须知道数据表名以及表中的字段名称以及类型,正如hibernate 使用 ...
- commons-lang3-3.2.jar中的常用工具类的使用
这个包中的很多工具类可以简化我们的操作,在这里简单的研究其中的几个工具类的使用. 1.StringUtils工具类 可以判断是否是空串,是否为null,默认值设置等操作: /** * StringUt ...
- Android工具类整合
Android-JSONUtil工具类 常用的Json工具类,包含Json转换成实体.实体转json字符串.list集合转换成json.数组转换成json public class JSONUtil ...
- 实用工具类--第三方开源--Lazy
下载地址 :https://github.com/ddwhan0123/Lazy 工具 描述 AnimationUtils 动画工具类 AppUtils APP相关信息工具类 AssetDatabas ...
随机推荐
- [采坑记录] OneDrive同步失败 不能自动上传 不能同步 不能登陆
虽然OneDrive送的空间并不大 但是用来传文档什么的还是够了 但是国内各种不舒服 比如说登陆不上(其他的微软系应用解决方法同理) 原因是因为DNS污染的问题 默认电脑链接上网络之后 DNS是路由器 ...
- C#加载XML方式
//path:xml文件路径 SECSMessage:xml文件的根元素下的第一个子集元素 <SECSLibrary> <SECSMessage> <Descripti ...
- 移动端rem屏幕设置
//修改页面title var pageTitle=document.getElementsByTagName("title")[0].innerHTML; if(location ...
- SVM资源
算法源码: SVM-From-Scratch:https://github.com/adityajn105/SVM-From-Scratch
- TOMCAT中文信息乱码改为GBK
# Licensed to the Apache Software Foundation (ASF) under one or more# contributor license agreements ...
- 「CF241E」Flights
传送门 Luogu 解题思路 首先对于所有不属于任何一条路径上的边,它的权值是任意的. 对于所有在路径上的边 \((u,v)\) 满足 \(1\le dis_v-dis_u\le2\) 差分约束即可. ...
- 创业学习---《预判项目的长期壁垒》--B-3.预判模块---HHR计划---以太一堂
一,<开始学习> 1,投资人经常会问CEO:你的项目的长期壁垒是什么?你是怎么思考的? 2,三个预热思考题: (1)突然有一天,大公司要抄你,你会怎么办? 答:用增长技术来和他竞争. ( ...
- 三天的Python课程
基础很sb但必须熟练掌握: 第一天就是Python的简单介绍与简单的接触.基本都是概念性的东西,需要知道一个非常便捷的IDE工具:pycharm,以后的编程就靠它了.还有就是%s和%d的格式化输出.运 ...
- Java单例和多例
背景:最近在学习韩老师的笔记时候发现不是很了解单例和多例,于是通过网上查找资料的方式去学习. 设计模式:最佳的实践,是软件开发人员在软件开发过程中面临一般解决方案,也就是开发的经验总结. 单例模式(S ...
- 转入软工后第一节java课的作业
这个作业,鸽了好久.本来大家都在中秋前发了,我摸摸索索加上各种缓慢的学习,终于是将他做完了. 做完之后,java最基本的输入输出功能都基本学习到了.下面附上代码: import java.util.* ...