DevTestOpsGuide

开发 测试 上线 的经验与笔记

View project on GitHub

Java 反射

类的分类和类型

Class.getEnclosingClass()方法可以看到类分为 5 种

  • 顶级 Top level classes
  • 嵌套 Nested classes (static member classes)
  • 内部 Inner classes (non-static member classes)
  • 本地 Local classes (named classes declared within a method)
  • 匿名 Anonymous classes

Type的子类/接口可以看到类类型也分 5 种

  • Class(子类,其他都是接口)
  • GenericArrayType []/…
  • ParameterizedType <>
  • TypeVariable T
  • WildcardType ?

显示类名可能是数组时用getTypeName(Exception不会是数组)

关于className的方法有四个

  • getSimpleName 匿名时空串
  • getName 数组时[L类名;
  • getTypeName 内部/匿名时$
  • getCanonicalName 内部/匿名时null

  • Class.forName 用的是 getName 获得的
  • 原生类型不能用 forName
  • 原生类型数组大多数是用首字母如int[].class就是[I,注意末尾没分号
  • boolean[].class[Zlong类型是[J

方法调用类型

下面的~invoke的简写

  • S ~static 静态
  • O ~special 私有/构造/super
  • M ~virtual 实例(可重写)
  • I ~interface 实现(应重写)
  • D ~dynamic lambda main 方法可以继承运行,不算重写(不能@Override

使用 JDK 自带的类来做解析工具的接口返回

一些常量或类型可以用诸如ModifierElementType的定义

不要使用ClassLoader获取类路径以免空指针异常

class A { void fun() {
    Main.class.getResource(""); // 该类包路径 √
    Main.class.getResource("/"); // 根路径 √
    ClassLoader.getSystemResource("");// 类的根路径,classpath file 模式下为 null
    ClassLoader.getSystemResource("/"); // null
    Main.class.getClassLoader().getResource(""); // 根路径
    Main.class.getClassLoader().getResource ("/"); // null
}}