利用反射机制遍历String的字段和方法、构造器

本文介绍了如何利用Java反射机制遍历String类的字段、方法和构造器。通过Class对象获取类信息,包括类名、公开方法、私有方法,以及变量和构造器。并提供了相关API的使用示例。
摘要由CSDN通过智能技术生成

利用反射机制遍历String的字段和方法、构造器

更多干货见博主个人网站:https://blog.zhenglin.work
利用java反射机制能获取某个类或某个对象的所属类、拥有的方法、成员变量等信息。很多java反编译工具就是利用这个机制。

类名的获取

java所有的类,都属于Class 类型,这个Class和class是不一样的,class属于java关键字、Class是类名,如同String一样,且Class是个泛型类。

获取具体的某个类的Class常见的有三种方式:

  • 在实例方法中 直接getClass,就能获取实例对象的Class类型

    知道类名可以通过以下两种方式获取Class

    • Class.forName(“具体类名,包含包名如:java.lang.Object”)

    • 直接用.class文件名称,如 Class cls = String.class

      方法的获取

      通过Class类型对象.getMethods获取所有公开方法、getDeclaredMethods获取所有方法 (不管是private还是public修饰的方法)
      getMethod(String name, Class<?>… parameterTypes) 获取指定名称方法(必须是public类型方法)、parameterTypes表示该方法有哪些参数,parameterTypes长度可变,如果为空,表示这个方法没有参数。

      同样getDeclaredMethod(String name, Class<?>… parameterTypes) 就是获取指定方法(不管是public还是private修饰的方法),parameterTypes参数就不作解释说明了。

      它们的返回值类型都是Method,Method 有哪些详细的方法,可以直接看源码或者jdk-api; 得到Method后还可以后续得到方法里面的参数、注解,一直延伸下去,直至得到自己需要的内容。

      变量(filed)、构造器以及注解的获取

      它们获取方式和方法非常雷同,如getFileds、getDeclaredFields 等、就不再赘述。

      • 说了这么多不如实战

      代码实现

       public static void showFiledsAndMethods(String classname){
             
              Class<?> cls = null;
              try{
             
                  cls = Class.forName(classname);
              }catch (ClassNotFoundException e){
             
                  e.printStackTrace();
              }
              System.out.println("---------------成员变量------------------");
              Stream.of(cls.getDeclaredFields()).forEach(System.out::println);
              System.out.println("---------------方法------------------");
              Stream.of(cls.getDeclaredMethods()).forEach(System.out::println);
              System.out.println("---------------构造器------------------");
              Stream.of(cls.getDeclaredConstructors()).forEach(System.out::println);
          }
          public static void main(String[] args) {
             
              showFiledsAndMethods("java.lang.String");
          }
      

      代码中使用的Stream流操作,用法可以参考:JDK8新特性Stream实战

      输出结果:

      ---------------成员变量------------------
      private final char[] java.lang.String.value
      private int java.lang.String.hash
      private static final long java.lang.String.serialVersionUID
      private static final java.io.ObjectStreamField[] java.lang.String.serialPersistentFields
      public static final java.util.Comparator java.lang.String.CASE_INSENSITIVE_ORDER
      ---------------方法------------------
      public boolean java.lang.String.equals(java.lang.Object)
      public java.lang.String java.lang.String.toString()
      public int java.lang.String.hashCode()
      public int java.lang.String.compareTo(java.lang.String)
      public int java.lang.String.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值