【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
https://blog.csdn.net/m0_69908381/article/details/130838927
出自【进步*于辰的博客】
注:依赖类:ReflectUtil、Proxy、SecurityManager。
注:
出于职业发展、时间成本、实用性等多方面考虑,暂缓此类源码解析,已有内容供大家粗略参考。
此类多数以get
为前缀的方法的示例在博文《[Java]反射》中。
文章目录
- 注:
- 1、概述
- 2、方法摘要
- 2.1 `<U>` Class<? extends U> asSubclass(Class`<U>` clazz)
- 2.2 T cast(Object obj)
- 2.3 boolean desiredAssertionStatus()
- 2.4 static Class<?> forName(String className)
- 2.5 static Class<?> forName(String name, boolean initialize, ClassLoader loader)
- 2.6 `<A extends Annotation>` A getAnnotation(Class`<A>` annotationClass)
- 2.7 Annotation[] getAnnotations()
- 2.8 String getCanonicalName()
- 2.9 Class[] getClasses()
- 2.10 ClassLoader getClassLoader()
- 2.11 Class<?> native getComponentType()
- 2.12 Constructor`<T>` getConstructor(Class... parameterTypes)
- 2.13 Constructor[] getConstructors()
- 2.14 Annotation[] getDeclaredAnnotations()
- 2.15 Class[] getDeclaredClasses()
- 2.16 Constructor`<T>` getDeclaredConstructor(Class... parameterTypes)
- 2.17 Constructor[] getDeclaredConstructors()
- 2.18 Field getDeclaredField(String name)
- 2.19 Field[] getDeclaredFields()
- 2.20 Method getDeclaredMethod(String name, Class... parameterTypes)
- 2.21 Method[] getDeclaredMethods()
- 2.22 Class<?> getDeclaringClass()
- 2.23 Class<?> getEnclosingClass()
- 2.24 Constructor<?> getEnclosingConstructor()
- 2.25 Method getEnclosingMethod()
- 2.26 T[] getEnumConstants()
- 2.27 Field getField(String name)
- 2.28 Field[] getFields()
- 2.29 Type[] getGenericInterfaces()
- 2.30 Type getGenericSuperclass()
- 2.31 Class[] getInterfaces()
- 2.32 Method getMethod(String name, Class... parameterTypes)
- 2.33 Method[] getMethods()
- 2.34 int getModifiers()
- 2.35 String getName()
- 2.36 Package getPackage()
- 2.37 ProtectionDomain getProtectionDomain()
- 2.38 URL getResource(String name)
- 2.39 InputStream getResourceAsStream(String name)
- 2.40 native Object[] getSigners()
- 2.41 String getSimpleName()
- 2.42 native Class<? super T> getSuperclass()
- 2.43 TypeVariable<Class`<T>`>[] getTypeParameters()
- 2.44 boolean isAnnotation()
- 2.45 boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
- 2.46 boolean isAnonymousClass()
- 2.47 boolean native isArray()
- 2.48 native boolean isAssignableFrom(Class<?> cls)
- 2.49 boolean isEnum()
- 2.50 native boolean isInstance(Object obj)
- 2.51 native boolean isInterface()
- 2.52 boolean isLocalClass()
- 2.53 boolean isMemberClass()
- 2.54 native boolean isPrimitive()
- 2.55 boolean isSynthetic()
- 2.56 T newInstance()
- 2.57 String toString()
- 3、方法摘要(不开放)
- 3.1 static native Class<?> getPrimitiveClass(String name)
- 3.4 private static native Class<?> forName0(String name, boolean initialize, ClassLoader loader, Class<?> caller)
- 3.5 private String resolveName(String name)
- 3.6 private void checkMemberAccess(int which, Class<?> caller, boolean checkProxyInterfaces)
- 3.9 private native Class<?>[] getInterfaces0()
- 4、嵌套类摘要
- 最后
1、概述
继承关系:
- java.lang.Object
- java.lang.Class
<T>
- java.lang.Class
参数类型
T - 此类对象建模的类的类型。 例如, String.class
的类型是 Class<String>
。 如果正在建模的类未知,请使用 Class<?> 。
所有已实现的接口:
Serializable、AnnotatedElement、GenericDeclaration、Type
public final class Class<T> extends Object implements Serializable, GenericDeclaration, Type, AnnotatedElement
Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。
Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass()
方法自动构造的。
以下示例使用 Class 对象来显示对象的类名:
void printClassName(Object obj) {
System.out.println("The class of " + obj +
" is " + obj.getClass().getName());
}
还可以使用一个类字面值(JLS Section 15.8.2)来获得命名类型(或 void
)的 Class 对象。例如:
System.out.println("The name of class Foo is: "+ Foo.class.getName());
从以下版本开始:
JDK1.0
另请参见:
ClassLoader.defineClass(byte[], int, int)
,序列化表格
2、方法摘要
2.1 <U>
Class<? extends U> asSubclass(Class<U>
clazz)
强制转换该 Class 对象,以表示指定的 class 对象所表示的类的一个子类。
public <U> Class<? extends U> asSubclass(Class<U> clazz) {
if (clazz.isAssignableFrom(this))
return (Class<? extends U>) this;
else
throw new ClassCastException(this.toString());
}
2.2 T cast(Object obj)
将一个对象强制转换成此 Class 对象所表示的类或接口。
public T cast(Object obj) {
if (obj != null && !isInstance(obj))
throw new ClassCastException(cannotCastMsg(obj));
return (T) obj;
}
一个疑惑:
\color{grey}{一个疑惑:}
一个疑惑:
看下述示例。
Class z1 = Integer.class;
z1.cast(2023);// 2023
由于2023
的类型是Integer
,故isInstance()
返回 true。因此,cast()
返回(T) obj
,得2023
。说明<T>
的类型实参是Integer
。
可实际上,我并未指定T
的类型实参为Integer
,且也未指定。那为何<T>
的类型实参是Integer
?
其中原因,可参考博文《[Java]泛型》的第8项。
2.3 boolean desiredAssertionStatus()
如果要在调用此方法时,将要初始化该类,则返回将分配给该类的断言状态。(暂未可知)
2.4 static Class<?> forName(String className)
返回与带有给定字符串名的类或接口相关联的 Class 对象。
public static Class<?> forName(String className)
throws ClassNotFoundException {
Class<?> caller = Reflection.getCallerClass();// 返回调用类的Class对象
return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
}
扩展说明:
扩展说明:
扩展说明:getCallerClass()
涉及到一个注解@CallerSensitive
,大家可在博文《[Java]知识点》的第18项中初步了解。
2.5 static Class<?> forName(String name, boolean initialize, ClassLoader loader)
使用给定的类加载器,返回与带有给定字符串名的类或接口相关联的 Class 对象。
底层逻辑:
\color{green}{底层逻辑:}
底层逻辑:判断指定类加载器是否为空,若为空,获取调用类的类加载器,再判断此类加载器是否为空,若不为空,授予“获取类加载器”权限,最后通过调用forName0()
返回相应 Class 对象。
示例:
Class z1 = Class.forName("java.lang.Integer");// class java.lang.Integer
Class z2 = ClassLoader.class;
Method m1 = z2.getDeclaredMethod("getClassLoader", Class.class);
m1.setAccessible(true);
Class z3 = Class.forName("java.lang.Integer", true, (ClassLoader) m1.invoke(null, z1));// class java.lang.Integer
2.6 <A extends Annotation>
A getAnnotation(Class<A>
annotationClass)
如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。
2.7 Annotation[] getAnnotations()
返回此元素上存在的所有注释。
2.8 String getCanonicalName()
返回《Java Language Specification》中所定义的基础类的规范化名称,即全限定名。
2.9 Class[] getClasses()
返回一个包含某些 Class 对象的数组,这些对象表示属于此 Class 对象所表示的类的成员的所有公共类和接口,包括从超类和公共类继承的以及通过该类声明的公共类和接口成员。(暂未可知)
2.10 ClassLoader getClassLoader()
返回此类的类加载器。
2.11 Class<?> native getComponentType()
返回表示数组组件类型的 Class。
示例:
Class z1 = int[].class;// int
z1 = Integer[].class;// java.lang.Integer
z1 = Object.class;// null
2.12 Constructor<T>
getConstructor(Class… parameterTypes)
返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
public Constructor<T> getConstructor(Class<?>... parameterTypes)
throws NoSuchMethodException, SecurityException {
checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);
return getConstructor0(parameterTypes, Member.PUBLIC);
}
2.13 Constructor[] getConstructors()
返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。
2.14 Annotation[] getDeclaredAnnotations()
返回直接存在于此元素上的所有注释。
2.15 Class[] getDeclaredClasses()
返回 Class 对象的一个数组,这些对象反映声明为此 Class 对象所表示的类的成员的所有类和接口,包括该类所声明的公共、保护、默认(包)访问及私有类和接口,但不包括继承的类和接口。(暂未可知)
2.16 Constructor<T>
getDeclaredConstructor(Class… parameterTypes)
返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。
2.17 Constructor[] getDeclaredConstructors()
返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。
2.18 Field getDeclaredField(String name)
返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
2.19 Field[] getDeclaredFields()
返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段,包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。
2.20 Method getDeclaredMethod(String name, Class… parameterTypes)
返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
2.21 Method[] getDeclaredMethods()
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
2.22 Class<?> getDeclaringClass()
如果此 Class 对象所表示的类或接口是另一个类的成员,则返回的 Class 对象表示该对象的声明类。(暂未可知)
2.23 Class<?> getEnclosingClass()
返回基础类的立即封闭类。
示例:
Class z1 = int.class;// null
z1 = Integer.class;// null
z1 = Object.class;// null
z1 = Locale.class;// null
z1 = Class.forName("java.lang.Class$EnclosingMethodInfo");// class java.lang.Class
基础类不是指基本数据类型,没有特殊含义。
顶级类不是指继承关系的超类或超接口,也不是指最终类,而是指封装关系的外部类。
因此,立即封闭类是指外部类。
2.24 Constructor<?> getEnclosingConstructor()
如果该 Class 对象表示构造方法中的一个本地或匿名类,则返回 Constructor 对象,它表示基础类的立即封闭构造方法。(暂未可知)
2.25 Method getEnclosingMethod()
如果此 Class 对象表示某一方法中的一个本地或匿名类,则返回 Method 对象,它表示基础类的立即封闭方法。(暂未可知)
2.26 T[] getEnumConstants()
如果此 Class 对象不表示枚举类型,则返回枚举类的元素或 null。(暂未可知)
2.27 Field getField(String name)
返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
2.28 Field[] getFields()
返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
2.29 Type[] getGenericInterfaces()
返回表示某些接口的 Type,这些接口由此对象所表示的类或接口直接实现。即父接口。
2.30 Type getGenericSuperclass()
返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type。即父类。
2.31 Class[] getInterfaces()
确定此对象所表示的类或接口实现的接口。
public Class<?>[] getInterfaces() {
ReflectionData<T> rd = reflectionData();
if (rd == null) {
// no cloning required
return getInterfaces0();
} else {
Class<?>[] interfaces = rd.interfaces;
if (interfaces == null) {
interfaces = getInterfaces0();
rd.interfaces = interfaces;
}
// defensively copy before handing over to user code
return interfaces.clone();
}
}
2.32 Method getMethod(String name, Class… parameterTypes)
返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
2.33 Method[] getMethods()
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。
2.34 int getModifiers()
返回此类或接口以整数编码的 Java 语言修饰符。(暂未可知)
2.35 String getName()
以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void
)名称。(缓存名称以减少对虚拟机的调用次数)
示例:
Class z1 = ArrayList.class;
z1.getName();
等同于:
Class z2 = Class.class;
Method m1 =z2.getDeclaredMethod("getName0", null);
m1.setAccessible(true);
m1.invoke(ArrayList.class, null);
返回全限定名。
2.36 Package getPackage()
获取此类的包。
2.37 ProtectionDomain getProtectionDomain()
返回该类的 ProtectionDomain。(暂未可知)
2.38 URL getResource(String name)
查找带有给定名称的资源。(暂未可知)
2.39 InputStream getResourceAsStream(String name)
查找具有给定名称的资源。(暂未可知)
2.40 native Object[] getSigners()
获取此类的标记。
返回此 Class 对象的signers
。如果没有signers
,返回 null。特殊情况,如果当前 Class 对象所表示的类/接口是基本数据类型或void
,也返回 null。
示例:
int.class;// 结果:null
void.class;// 结果:null
Integer.class;// 结果:null
Void.class;// 结果:null
暂未知标记是何物。
2.41 String getSimpleName()
返回源代码中给出的基础类的简称,即类或接口名。
返回源代码中给出的基础类的简单名称。如果底层类是匿名类,则返回""
。
数组的简单名称是附加了“[]
”的组件类型的简单名称。特别地,组件类型为匿名类的数组的简单名称为"[]
"。
示例:
Class z1 = int.class;// int
z1 = int[].class;// int[],注:附加指附加后缀
z1 = Integer.class;// Integer
z1 = Integer[].class;// Integer[]
Predicate<Integer> ser1 = new Predicate<Integer>() {
@Override
public boolean test(Integer a) {
return a.equals(0);
}
};
z1 = ser1.getClass();// ""
2.42 native Class<? super T> getSuperclass()
返回实体(类、接口、基本类型或 void
)的父类的 Class 对象。
如果此实体表示 Object 类、接口、基本数据类型或void
,则返回 null;如果表示一个数组类,则返回Object.class
。
示例:
Class z1 = Object.class;
System.out.println(z1.getSuperclass());
z1 = Consumer.class;// Consumer 是一个 Java内置接口
System.out.println(z1.getSuperclass());
z1 = int.class;
System.out.println(z1.getSuperclass());
z1 = void.class;
System.out.println(z1.getSuperclass());
z1 = int[].class;
System.out.println(z1.getSuperclass());
z1 = Integer[].class;
System.out.println(z1.getSuperclass());
z1 = Object[].class;
System.out.println(z1.getSuperclass());
打印结果。
补充说明: \color{red}{补充说明:} 补充说明:
关于
super
关键字,可查阅博文《[Java]泛型》的第5.3.1项。
super
的作用是将类型实参的范围限制在“下边界”的父类或超类。
因此,此方法返回的应该是:表示此实体的“父类或超类”的 Class 对象。但经过测试,返回的仅是其父类的 Class 对象,不包括“超类”。
2.43 TypeVariable<Class<T>
>[] getTypeParameters()
按声明顺序返回 TypeVariable 对象的一个数组,这些对象表示用此 GenericDeclaration 对象所表示的常规声明来声明的类型变量。(暂未可知)
2.44 boolean isAnnotation()
如果此 Class 对象表示一个注释类型,则返回 true。
2.45 boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。
2.46 boolean isAnonymousClass()
当且仅当基础类是匿名类时,返回 true。
2.47 boolean native isArray()
判定此 Class 对象是否表示一个数组类。
2.48 native boolean isAssignableFrom(Class<?> cls)
判定此 Class 对象所表示的类或接口与指定的 Class 参数所表示的类或接口是否相同,或是否是其超类或超接口。
确定此 Class 对象表示的类或接口是否与指定的 Class 参数表示的类或接口相同,或者是否是该类或接口的超类或超接口。如果是,则返回 true;否则返回 false。如果此 Class 对象表示基本数据类型,且指定的 Class 参数恰好是此 Class 对象,则此方法返回 true;否则返回false。
具体而言,此方法测试是否可以通过 标识转换 \color{green}{标识转换} 标识转换或通过 扩展引用转换 \color{blue}{扩展引用转换} 扩展引用转换将指定的 Class 参数表示的类型转换为此 Class 对象表示的类型。
2.49 boolean isEnum()
当且仅当该类声明为源代码中的枚举时返回 true。
2.50 native boolean isInstance(Object obj)
判定指定的 Object 是否与此 Class 所表示的对象赋值兼容。
确定指定的对象是否与此类表示的对象的赋值兼容。这个方法是Java语言instanceof
操作符的动态等效。如果指定的 Object 参数非空,则该方法返回 true,并且可以将其强制转换为由此 Class 对象表示的引用类型而不会引发ClassCastException;否则返回 false。
具体来说,如果这个 Class 对象表示一个已声明的类,如果指定的 Object 参数是所表示的类(或其任何子类)的实例,则此方法返回 true;否则返回 false。如果此 Class 对象表示数组类,且指定的 Object 参数可以通过标识转换 或扩展引用转换 转换为数组类的对象,则此方法返回 true;否则返回 false。如果这个 Class 对象表示一个接口,且指定 Object 参数的类或任何超类实现了这个接口,则此方法返回 true;否则返回 false。如果此 Class 对象表示基本数据类型,则此方法返回 false。
此方法常用于包装类中判断“是否可赋值”。
2.51 native boolean isInterface()
判定指定的 Class 对象是否表示一个接口。
2.52 boolean isLocalClass()
当且仅当基础类是本地类时返回 true。(暂未可知)
2.53 boolean isMemberClass()
当且仅当基础类是成员类时返回 true。(暂未可知)
2.54 native boolean isPrimitive()
判定指定的 Class 对象是否表示一个基本类型。
2.55 boolean isSynthetic()
如果此类是复合类,则返回 true,否则 false。
复合类也称之为组合类,是指将一个类(A)的对象作为另一个类(B)的成员变量,即 B 依赖于 A,则 B 是复合类。
这是C++中复合类的定义,而在java中,经测试,暂未可知。
2.56 T newInstance()
创建此 Class 对象所表示的类的一个新实例。
2.57 String toString()
将对象转换为字符串。
3、方法摘要(不开放)
3.1 static native Class<?> getPrimitiveClass(String name)
返回指定名称所对应的类型为 虚拟机 C l a s s 类型 \color{green}{虚拟机 Class 类型} 虚拟机Class类型(原始数据类型或基本数据类型)的 Class 对象。
3.4 private static native Class<?> forName0(String name, boolean initialize, ClassLoader loader, Class<?> caller)
在检查系统安全通过后访问,返回加载指定信息创建的 Class 对象。
3.5 private String resolveName(String name)
将指定类全限定名转换成路径并返回。
private StringresolveName(String name) {
if (name == null) {
return name;
}
if (!name.startsWith("/")) {
Class<?> c = this;
while (c.isArray()) {// 是否是数组类
c = c.getComponentType();// 获取组件类类型
}
String baseName = c.getName();
int index = baseName.lastIndexOf('.');
if (index != -1) {
name = baseName.substring(0, index).replace('.', '/')
+"/"+name;
}
} else {
name = name.substring(1);
}
return name;
}
示例:
Class z1 = Class.class;
Method m1 = z1.getDeclaredMethod("resolveName", String.class);
m1.setAccessible(true);
m1.invoke(ArrayList.class, "AL");// java/util/AL
m1.invoke(ArrayList.class, "/AL");// AA
3.6 private void checkMemberAccess(int which, Class<?> caller, boolean checkProxyInterfaces)
检查客户端是否允许访问成员。如果访问被拒绝,抛出 SecurityException。
3.9 private native Class<?>[] getInterfaces0()
返回当前 Class 对象所表示类的接口数组。
示例:
Class z1 = Class.class;
Method m1 =z1.getDeclaredMethod("getInterfaces0", null);
m1.setAccessible(true);
Class[] arr = (Class[]) m1.invoke(ArrayList.class, null);
结果:
interface java.util.List
interface java.util.RandomAccess
interface java.lang.Cloneable
interface java.io.Serializable
4、嵌套类摘要
4.2 ReflectionData<T>
反射数据类或类成员类。
private static class ReflectionData<T> {
volatile Field[] declaredFields;// 所有变量
volatile Field[] publicFields;// 由public修饰的变量
volatile Method[] declaredMethods;// 所有成员方法和类方法
volatile Method[] publicMethods;// 由public修饰的成员方法和类方法
volatile Constructor<T>[] declaredConstructors;// 所有构造方法
volatile Constructor<T>[] publicConstructors;// 由public修饰的构造方法
// Intermediate results for getFields and getMethods
volatile Field[] declaredPublicFields;// 由public修饰的变量
volatile Method[] declaredPublicMethods;// 由public修饰的方法
volatile Class<?>[] interfaces;// 所有继承或实现的类或接口
// Value of classRedefinedCount when we created this ReflectionData instance
final int redefinedCount;// 类重新定义次数,暂不清楚具体作用
ReflectionData(int redefinedCount) {
this.redefinedCount = redefinedCount;
}
}
此内部类用于存放 Class`类的各类成员,用于反射时获取。
最后
如果大家需要Java-API文档,我上传了《Java-API文档-包含5/8/11三个版本》。
本文暂缓更新。