java 反射getClass .class 的使用方法示例

 更新时间:2019年11月20日 09:46:26   作者:倾听岁月  
这篇文章主要介绍了java 反射getClass .class 的使用方法,结合实例形式分析了java类反射机制的相关操作技巧,需要的朋友可以参考下

本文实例讲述了java 反射getClass .class 的使用方法。分享给大家供大家参考,具体如下:

java反射机制

怎么从一个实例上的获得类反射

/**
 * obj 实例的对象
 * getClass() 获得该实例类的反射
 * @return 
 * Class<? extends Object>
 */
obj.getClass();
//例子
String str1 = "123";
Class<?> strClass1 = str1.getClass();
String str2 = new String("456");
Class<?> strClass2 = str2.getClass();

怎么从一个类上获得类的反射

/**
 * ClassName 类名称
 * .class 该类的属性
 * @return
 * Class<? extends Object>
 */
ClassName.class
//例子
Class<?> a = String.class
Class<?> b = Integer.class
Class<?> c = Double.class

package Main;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import Demo.Demo1;
public class Index 
{
  public static void main(String[] agrs) throws Exception
  {
    Demo1 obj = new Demo1();
    String str = (String)runTargetMethod(obj,"test1",new Class[]{String.class,String.class},new Object[]{"2","3"});
    System.out.println(str);
    System.out.println();
    System.out.println();
    System.out.println();
    dumpTargetMethod(obj);
  }
  /**
   * 调用指定对象的指定方法。
   * @param Object obj 对象实例
   * @param String methodName 要调用的方法名称
   * @param Class<?>[] classes 方法中的参数对象
   * @param Object[] valObj 需要向参数中传递的值 
   * @return Object 直接结果
   * */
  public static Object runTargetMethod(Object obj,String methodName,Class<?>[] classes,Object[] valObj) throws Exception
  {
    Class<?> classObj = obj.getClass();
    Method method = classObj.getMethod(methodName,classes);
    return method.invoke(obj, valObj);
  }
  /**
   * 打印对象内容
   * @param Object obj 对象实例
   * @throws IllegalAccessException 
   * @throws IllegalArgumentException 
   * */
  public static void dumpTargetMethod(Object obj) throws IllegalArgumentException, IllegalAccessException
  {
    Class<?> classObj = obj.getClass();
    System.out.println("-------------------method dump-------------------------");
    Method[] methods = classObj.getDeclaredMethods();
    for(Method method : methods)
    {
      Class<?>[] parameters = method.getParameterTypes();
      StringBuffer strBuffer = new StringBuffer();
      for(int i=0;i<parameters.length;i++)
      {
        if(i < (parameters.length - 1))
          strBuffer.append(parameters[i].getName() + ",");
        else
          strBuffer.append(parameters[i].getName());
      }
      if(!strBuffer.toString().isEmpty())
      {
        System.out.println("method info (method modifier : " + Modifier.toString(method.getModifiers()) + "  method return type : " + method.getReturnType().getName() + "  method name : " + method.getName() + " parameters : " + strBuffer.toString() + ")");
      }else{
        System.out.println("method info (method modifier : " + Modifier.toString(method.getModifiers()) + "  method return type : " + method.getReturnType().getName() + "  method name : " + method.getName() + " parameters : null)");
      }
    }
    System.out.println("-------------------method dump-------------------------");
    System.out.println("-------------------------------------------------------");
    System.out.println("-------------------fields dump-------------------------");
    Field[] fields = classObj.getDeclaredFields();
    for(Field field : fields)
    {
      //能够访问该字段
      field.setAccessible(true);
      System.out.println("field info (modifier : " + Modifier.toString(field.getModifiers()) + "  type : " + field.getType().getName() + " " + " name : " + field.getName() + " defaultValue : " + field.get(obj).toString() + ")");
    }
  }
}

package Demo;
/**
 * Demo 测试类
 */
public class Demo1 
{
  public String demo1 = "demo1_val";
  protected String demo2 = "demo2_val";
  private String demo3 = "demo3_val";
  public static String demo4 = "demo4_val";
  public String getName()
  {
    return "my name is 勇哥";
  }
  public int getAge()
  {
    return 22;
  }
  public String test1(String str1,String str2)
  {
    StringBuffer buffer = new StringBuffer(str1);
    buffer.append(str2);
    return buffer.toString();
  }
  public String test1()
  {
    return "123";
  }
}

更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

相关文章

  • log4j日志格式加入自定义字段信息方式

    log4j日志格式加入自定义字段信息方式

    这篇文章主要介绍了log4j日志格式加入自定义字段信息方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SpringBoot2.1.4中的错误处理机制

    SpringBoot2.1.4中的错误处理机制

    这篇文章主要介绍了SpringBoot2.1.4中的错误处理机制,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 浅谈java Collection中的排序问题

    浅谈java Collection中的排序问题

    下面小编就为大家带来一篇浅谈java Collection中的排序问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • SpringBoot多级缓存实现方案总结

    SpringBoot多级缓存实现方案总结

    所谓多级缓存,是指在整个系统架构的不同系统层面进行数据缓存,以提升访问速度,多级缓存就是为了解决项目服务中单一缓存使用不足的缺点,本文我们将给大家总结了SpringBoot多级缓存实现方案,需要的朋友可以参考下
    2023-08-08
  • 基于XML配置Spring的自动装配过程解析

    基于XML配置Spring的自动装配过程解析

    这篇文章主要介绍了基于XML配置Spring的自动装配过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 关于SpringBoot整合redis使用Lettuce客户端超时问题

    关于SpringBoot整合redis使用Lettuce客户端超时问题

    使用到Lettuce连接redis,一段时间后不操作,再去操作redis,会报连接超时错误,在其重连后又可使用,纠结是什么原因导致的呢,下面小编给大家带来了SpringBoot整合redis使用Lettuce客户端超时问题及解决方案,一起看看吧
    2021-08-08
  • Mybatis映射文件规则实例详解

    Mybatis映射文件规则实例详解

    在映射文件当中,mapper元素是映射文件的根元素,其他的标签都是它的子元素,下面这篇文章主要给大家介绍了关于Mybatis映射文件规则的相关资料,需要的朋友可以参考下
    2022-04-04
  • spring如何集成cxf实现webservice接口功能详解

    spring如何集成cxf实现webservice接口功能详解

    这篇文章主要给大家介绍了关于spring如何集成cxf实现webservice接口功能的相关资料,文中通过示例代码介绍的非常详细,对大家 的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2018-07-07
  • Java Swing SpringLayout弹性布局的实现代码

    Java Swing SpringLayout弹性布局的实现代码

    这篇文章主要介绍了Java Swing SpringLayout弹性布局的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • SpringBoot AnnotationUtils工具类的使用实例详解

    SpringBoot AnnotationUtils工具类的使用实例详解

    这篇文章主要介绍了SpringBoot AnnotationUtils工具类的使用,使用自定义注解标记业务方法,原生Java获取注解及AnnotationUtils工具类获取方法,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-09-09

最新评论