反射工具类【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&amp;t=blog" target="_blank">java</a> <span>/</span></li>
<li><a href="http://so.csdn.net/so/search/s.do?q=反射&amp;t=blog" target="_blank">反射</a> <span>/</span></li>
<li><a href="http://so.csdn.net/so/search/s.do?q=reflection&amp;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&lt;?&gt; 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&lt;?&gt; 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&lt;?&gt;[] parameterTypes = constructor.getParameterTypes();
    int length = parameterTypes.length;
    for (int j = 0; j &lt; length; j++) {
    Class&lt;?&gt; parameterType = parameterTypes[j]; String parameterTypeName = parameterType.getSimpleName(); if (j &lt; 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&lt;?&gt; returnClass = method.getReturnType();
    String returnType = returnClass.getSimpleName();
    sb.append(returnType + " "); // 方法名
    String methodName = method.getName();
    sb.append(methodName + " ("); // 形参列表
    Class&lt;?&gt;[] parameterTypes = method.getParameterTypes();
    int length = parameterTypes.length; for (int j = 0; j &lt; length; j++) {
    Class&lt;?&gt; parameterType = parameterTypes[j]; // 形参类型
    String parameterTypeName = parameterType.getSimpleName(); if (j &lt; 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&lt;?&gt; returnClass = method.getReturnType();
    String returnType = returnClass.getSimpleName();
    sb.append(returnType + " "); // 方法名
    String methodName = method.getName();
    sb.append(methodName + " ("); // 形参列表
    Class&lt;?&gt;[] parameterTypes = method.getParameterTypes();
    int length = parameterTypes.length; for (int j = 0; j &lt; length; j++) {
    Class&lt;?&gt; parameterType = parameterTypes[j]; // 形参类型
    String parameterTypeName = parameterType.getSimpleName(); if (j &lt; 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 &lt; length; j++) {
    // 获取对应的泛型【Type类型】
    Type interfaceType = interfaceTypes[j];
    // 转换为Class类型
    Class&lt;?&gt; interfaceClass = (Class&lt;?&gt;) 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);

    }

}

http://blog.csdn.net/adsl624153/article/details/71190114

反射工具类【ReflectionUtils】的更多相关文章

  1. java反射工具类

    package com.yingchao.kgou.core; import java.lang.reflect.Field; import java.lang.reflect.InvocationT ...

  2. 反射工具类——ReflectUtils

    测试方法:根据已知的方法名,来反射调用方法 package com.redmoon.forum.job; import java.util.ArrayList; import java.util.Li ...

  3. 反射工具类.提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,被AOP过的真实类等工具函数.java

    import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.ap ...

  4. Java 反射工具类封装

    封装了常用的反射相关方法 public class ReflectUtil { /** * 通过类路径获取Class * * @author LHY <br> * Description ...

  5. Atitit apache 和guava的反射工具

    Atitit apache 和guava的反射工具 apache1 Spring的反射工具类 ReflectionUtils1 Guava 反射工具2 apache  34             7 ...

  6. java使用注解和反射打造一个简单的jdbc工具类

    a simple jdbc tools 如有转载和引用,请注明出处,谢谢 1. 定义我们需要的注解 要想实现对数据库的操作,我们必须知道数据表名以及表中的字段名称以及类型,正如hibernate 使用 ...

  7. commons-lang3-3.2.jar中的常用工具类的使用

    这个包中的很多工具类可以简化我们的操作,在这里简单的研究其中的几个工具类的使用. 1.StringUtils工具类 可以判断是否是空串,是否为null,默认值设置等操作: /** * StringUt ...

  8. Android工具类整合

    Android-JSONUtil工具类 常用的Json工具类,包含Json转换成实体.实体转json字符串.list集合转换成json.数组转换成json public class JSONUtil ...

  9. 实用工具类--第三方开源--Lazy

    下载地址 :https://github.com/ddwhan0123/Lazy 工具 描述 AnimationUtils 动画工具类 AppUtils APP相关信息工具类 AssetDatabas ...

随机推荐

  1. android nfc功能开发

    链接:Android NFC开发详细总结   https://blog.csdn.net/zhwadezh/article/details/79111348 链接2:Android NFC功能 简单实 ...

  2. 吴裕雄 python 神经网络——TensorFlow 循环神经网络处理MNIST手写数字数据集

    #加载TF并导入数据集 import tensorflow as tf from tensorflow.contrib import rnn from tensorflow.examples.tuto ...

  3. ARM相关概念(学习目标、分类、商业模式及半导体公司、嵌入式处理器)

    1.学习ARM的目标 (1)对比X86,8051汇编,从更底层的角度去理解相关知识 (2)为后续嵌入式课程做准备 (3)了解ARM的体系结构,能够看懂ARM汇编 2.ARM分类 (1)按照版本号分类: ...

  4. Library management system design requirements

    1)软件需求说明书 1. 引言 1.1 编写目的:本需求的编写是为了研究图书管理系统软件的开发途径和应用方法.同时它也是进行项目策划.概要设计和详细设计的基础,是维护人员进行内部维护,信息更新,验收和 ...

  5. 五、request模块

    描述:requests是python的一个第三方HTTP(Hypertext Transfer Protocol,超文本传输协议)库,它比python自带的网络库urllib更加简单.方便和人性化:使 ...

  6. Java面向对象的局部变量和成员变量

    package cn.itcast.day06.demo03; /* 局部变量和成员变量 1. 定义的位置不一样[重点] 局部变量:在方法的内部,类的方法内部 成员变量:在方法的外部,直接写在类当中 ...

  7. 【译】高级T-SQL进阶系列 (七)【上篇】:使用排序函数对数据进行排序

    [译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正] 原文链接:传送门. 什么是排序函数(Ranking Functions)? 排序函数基于一组记录的集合返回一个排序值.一个排序值其实 ...

  8. ubuntu-查看所有用户

    cat /etc/shadow :后面的全是用户

  9. Spring学习(九)

    JdbcTemplate需要的jar包 1.Spring核心必须依赖的库:commons-logging-1.1.1.jar2.Spring IoC部分核心库: spring-beans-4.3.9. ...

  10. Python学习第二十四课——Mysql 外键约束

    外键:主要是关联两个表的 举个栗子:在建表中创建外键 -- 添加外键例子 CREATE TABLE teacher( id TINYINT PRIMARY KEY auto_increment, na ...