JDK源码阅读之Class

Java基本类之一,反射机制的基础

class中方法分为三类: 

生成实例

forName方法和newInstance方法。

获取类信息

getDeclaredMethods

类型转换

 

class中重要方法解析

 
  1. public final

  2. class Class<T> implements java.io.Serializable,

  3. java.lang.reflect.GenericDeclaration,

  4. java.lang.reflect.Type,

  5. java.lang.reflect.AnnotatedElement {

  6. private static final int ANNOTATION= 0x00002000;//注释类型

  7. private static final int ENUM = 0x00004000;//枚举类型

  8. private static final int SYNTHETIC = 0x00001000;//合成类型,注0

  9. //枚举是一种类(class),注释是一种接口(interface)

  10. private transient String name;//全限定名(包+类名)

  11. private native String getName0();//本地方法获取name属性

  12. //注册本地方法

  13. private static native void registerNatives();

  14. static {

  15. registerNatives();

  16. }

  17. private Class() {}//唯一私有构造方法,说明Class不可由用户构造实例

  18. public String toString() {

  19. //这里重写toString,只区别了接口和Class

  20. return (isInterface() ? "interface " : (isPrimitive() ? "" : "class "))

  21. + getName();

  22. }

  23. //通过类全限定名获得该类(或接口)的Class对象(加载该类)

  24. @CallerSensitive //注1

  25. public static Class<?> forName(String className)

  26. throws ClassNotFoundException {

  27. Class<?> caller = Reflection.getCallerClass();

  28. return forName0(className, true, ClassLoader.getClassLoader(caller), caller);

  29. }

  30. @CallerSensitive

  31. public static Class<?> forName(String name, boolean initialize,

  32. ClassLoader loader)

  33. throws ClassNotFoundException

  34. {

  35. //initialize : 是否立即初始化该类,注2

  36. //loader : 使用指定的类加载器加载

  37. }

  38. private static native Class<?> forName0(String name, boolean initialize,

  39. ClassLoader loader,

  40. Class<?> caller)

  41. throws ClassNotFoundException;

  42. //反射获得该类实例对象

  43. @CallerSensitive

  44. public T newInstance()

  45. throws InstantiationException, IllegalAccessException

  46. {

  47. //JDK明言:本方法在当前Java内存模型下不一定是正确的

  48. //反射获取该类实例对象,实例化对象不是通过new指令,而是直接

  49. //通过本地方法获取类的公有构造方法(无参),然后通过Constructor的

  50. //newInstance();方法实例化对象

  51. //这个过程还要检查是否有权限反射实例化该对象

  52. }

  53. //缓存上面方法已获取的公有构造方法,供下次使用

  54. private volatile transient Constructor<T> cachedConstructor;

  55. //缓存调用本方法的最初对象的类Class对象,供安全检查使用,见注1

  56. private volatile transient Class<?> newInstanceCallerCache;

  57. //判断obj对象是否是该Class的实例

  58. public native boolean isInstance(Object obj);

  59. //判断cls是否是调用者同一类型或其子类类型

  60. public native boolean isAssignableFrom(Class<?> cls);

  61. //判断该Class是否是接口类型

  62. public native boolean isInterface();

  63. //判断该Class是否是数组类型

  64. public native boolean isArray();

  65. //判断该Class是否是基本类型,注3(八大基本类型+一特殊基本类型)

  66. public native boolean isPrimitive();

  67. //判断该Class是否是注释类型

  68. public boolean isAnnotation() {

  69. return (getModifiers() & ANNOTATION) != 0;

  70. }

  71. //判断该Class是否是合成类型

  72. public boolean isSynthetic() {

  73. return (getModifiers() & SYNTHETIC) != 0;

  74. }

  75. public String getName() {

  76. String name = this.name;

  77. if (name == null)

  78. this.name = name = getName0();//通过本地方法获取全路径类名

  79. return name;

  80. }

  81. //获取加载该类的类加载器

  82. @CallerSensitive

  83. public ClassLoader getClassLoader() {

  84. ClassLoader cl = getClassLoader0();

  85. if (cl == null)

  86. return null;

  87. SecurityManager sm = System.getSecurityManager();//注5

  88. if (sm != null) {

  89. ClassLoader.checkClassLoaderPermission(cl, Reflection.getCallerClass());

  90. }

  91. return cl;

  92. }

  93. native ClassLoader getClassLoader0();

  94. //返回该类中变量字段的类型变量数组,按声明顺序排序,注4

  95. public TypeVariable<Class<T>>[] getTypeParameters() {

  96. if (getGenericSignature() != null)

  97. return (TypeVariable<Class<T>>[])getGenericInfo().getTypeParameters();

  98. else

  99. return (TypeVariable<Class<T>>[])new TypeVariable<?>[0];

  100. }

  101. //获得该类的直接父类的Class对象,如果该类是接口,则返回null

  102. public native Class<? super T> getSuperclass();

  103. //返回带参数化类型的直接父类的类型

  104. public Type getGenericSuperclass() {}

  105. //获取该类的包路径

  106. public Package getPackage() {

  107. return Package.getPackage(this);

  108. }

  109. //获取该类直接实现的所有接口

  110. public native Class<?>[] getInterfaces();

  111. //获取所有接口,同上面的不同之处在于,若超接口是参数化类型(泛型)则返回的是其实际类型

  112. public Type[] getGenericInterfaces() {

  113. if (getGenericSignature() != null)

  114. return getGenericInfo().getSuperInterfaces();

  115. else

  116. return getInterfaces();

  117. }

  118. /**返回数组类型,若该类不是数组,返回null

  119. * 如:A[] a = new A[];

  120. * a.getClass().getComponentType()返回的是A类型(全路径名)

  121. */

  122. public native Class<?> getComponentType();

  123. //返回这个类的修饰符的对应的int值,二者可通过Modifier.toString()转换

  124. public native int getModifiers();

  125. //获取该类的所有签名(标记)列表

  126. public native Object[] getSigners();

  127. //设置该类的签名,注意方法修饰是默认,所以只有同包下类可用

  128. native void setSigners(Object[] signers);

  129. /**

  130. * 以上两个方法不是很懂具体用来干什么的,估计是和安全检查什么有关,因为

  131. * setSigners()是默认修饰,只能同包下访问(这就是说,用户是用不了的)

  132. */

  133. }

 JVM注解@CallSensitive

https://blog.csdn.net/hel_wor/article/details/50199797

1.forName 
  静态方法,通过类的全限定名加载类,返回该类的Class对象,forName有两个重载,forName(String)和forName(String, boolean, ClassLoader),其中,第一个参数是类的全限定名,第二个参数是指加载该类的后是否初始化该类,默认是加载后并初始化该类,最后一个参数是指使用哪个类加载器加载该类,默认是使用当前类的类加载器加载该类。 
2.newInstance 
  创建该Class对象对应的对象实例,只有当类具有公有的无参构造方法才能成功,否则抛异常,关于newInstance详见:newInstance和new(编辑中)。 
3.getClassLoader 
  获得加载该类的类加载器,在本JVM(Oracle HotSopt),当本类的类加载器是引导类加载器(bootStrap)则返回的是null。(类的加载见上面注2。) 
4.getTypeParameters 
  返回该类中声明(定义)的类变量数组

猜你喜欢

转载自blog.csdn.net/qq_40285302/article/details/81661582