Java源碼賞析(六)Class 類
目的
Class
這篇文章將Class
程式碼
package java.lang;
//省略 import
/**
* 類的實例:正在運行的Java應用中的類/介面
*/
public final class Class<T> implements java.io.Serializable,
GenericDeclaration,
Type,
AnnotatedElement {
private static final int ANNOTATION= 0x00002000;
private static final int ENUM = 0x00004000;
private static final int SYNTHETIC = 0x00001000;
private static native void registerNatives();
static {
registerNatives();
}
/*
* 私有化構造方法,只有JVM才能創建Class對象
*/
private Class(ClassLoader loader) {
classLoader = loader;
}
/**
* 根據類型生成字元串 "介面/類 名稱"
*/
public String toString() {
return (isInterface() ? "interface " : (isPrimitive() ? "" : "class "))
+ getName();
}
/**
* 給出完整名稱(包括類型,修飾符,參數等)
*
* @since 1.8
*/
public String toGenericString() {
...
}
/**
* 通過類的全限定名獲取Class對象
*/
@CallerSensitive
public static Class<?> forName(String className)
throws ClassNotFoundException {
Class<?> caller = Reflection.getCallerClass();
return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
}
/**
* 調用類的無參構造方法創建對象
*/
@CallerSensitive
public T newInstance()
throws InstantiationException, IllegalAccessException
{
...
}
/**
* 判斷obj是否動態等效(dynamic equivalent)某個類的實例化對象
*/
public native boolean isInstance(Object obj);
/**
* cls的參數和某個類是否一致,或是否為超類或超介面
*/
public native boolean isAssignableFrom(Class<?> cls);
/**
* 本地方法判斷是否為介面
*/
public native boolean isInterface();
/**
* 本地方法判斷是否為數組
*/
public native boolean isArray();
/**
* 本地方法判斷是否為基礎數據類型
*/
public native boolean isPrimitive();
/**
* 判斷是否為註解
*/
public boolean isAnnotation() {
return (getModifiers() & ANNOTATION) != 0;
}
/**
* 判斷是否為Java語言規範所定義的綜合類
*/
public boolean isSynthetic() {
return (getModifiers() & SYNTHETIC) != 0;
}
/**
* 獲取類的名稱
*/
public String getName() {
String name = this.name;
if (name == null)
this.name = name = getName0();
return name;
}
/**
* 獲取類載入器
*/
@CallerSensitive
public ClassLoader getClassLoader() {
ClassLoader cl = getClassLoader0();
if (cl == null)
return null;
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
ClassLoader.checkClassLoaderPermission(cl, Reflection.getCallerClass());
}
return cl;
}
/**
* 獲得類的類型參數
*/
@SuppressWarnings("unchecked")
public TypeVariable<Class<T>>[] getTypeParameters() {
ClassRepository info = getGenericInfo();
if (info != null)
return (TypeVariable<Class<T>>[])info.getTypeParameters();
else
return (TypeVariable<Class<T>>[])new TypeVariable<?>[0];
}
/**
* 獲得該類的父類
*/
public native Class<? super T> getSuperclass();
/**
* 獲得該類的父類(包含泛型參數)
* @since 1.5
*/
public Type getGenericSuperclass() {
ClassRepository info = getGenericInfo();
if (info == null) {
return getSuperclass();
}
if (isInterface()) {
return null;
}
return info.getSuperclass();
}
/**
* 獲得包
*/
public Package getPackage() {
return Package.getPackage(this);
}
/**
* 獲得實現的介面數組
*/
public Class<?>[] getInterfaces() {
ReflectionData<T> rd = reflectionData();
if (rd == null) {
return getInterfaces0();
} else {
Class<?>[] interfaces = rd.interfaces;
if (interfaces == null) {
interfaces = getInterfaces0();
rd.interfaces = interfaces;
}
return interfaces.clone();
}
}
/**
* 獲得實現的介面數組(帶泛型)
*/
public Type[] getGenericInterfaces() {
ClassRepository info = getGenericInfo();
return (info == null) ? getInterfaces() : info.getSuperInterfaces();
}
/**
* 獲得數組的Class對象
*/
public native Class<?> getComponentType();
/**
* 獲得類的修飾符
*/
public native int getModifiers();
/**
* 獲得類的簽名
*/
public native Object[] getSigners();
/**
* 設置類的簽名
*/
native void setSigners(Object[] signers);
/**
* 若該類是本地類或匿名類,則獲取此類的方法
* @since 1.5
*/
@CallerSensitive
public Method getEnclosingMethod() throws SecurityException {
...
}
/**
* 若該類是本地類或匿名類,則獲取此類的構造方法
* @since 1.5
*/
@CallerSensitive
public Constructor<?> getEnclosingConstructor() throws SecurityException {
...
}
/**
* 返回聲明此方法的類
*/
@CallerSensitive
public Class<?> getDeclaringClass() throws SecurityException {
final Class<?> candidate = getDeclaringClass0();
if (candidate != null)
candidate.checkPackageAccess(
ClassLoader.getClassLoader(Reflection.getCallerClass()), true);
return candidate;
}
/**
* 若該類是本地類或匿名類,則獲取此類的外部類
* @since 1.5
*/
@CallerSensitive
public Class<?> getEnclosingClass() throws SecurityException {
...
}
/**
* 獲得一個簡單類名
* @since 1.5
*/
public String getSimpleName() {
...
}
/**
* 獲得該類類型的名稱
* @since 1.8
*/
public String getTypeName() {
...
}
/**
* 獲得Java語言規範定義的名稱
* @since 1.5
*/
public String getCanonicalName() {
...
}
/**
* 判斷是否為局部類
* @since 1.5
*/
public boolean isLocalClass() {
return isLocalOrAnonymousClass() && !isAnonymousClass();
}
/**
* 判斷是否為成員類
* @since 1.5
*/
public boolean isMemberClass() {
return getSimpleBinaryName() != null && !isLocalOrAnonymousClass();
}
/**
* 獲得類的全限定名稱
*/
private String getSimpleBinaryName() {
Class<?> enclosingClass = getEnclosingClass();
if (enclosingClass == null) // top level class
return null;
try {
return getName().substring(enclosingClass.getName().length());
} catch (IndexOutOfBoundsException ex) {
throw new InternalError("Malformed class name", ex);
}
}
/**
* 獲得類以及父類的所有的public的內部類
*/
@CallerSensitive
public Class<?>[] getClasses() {
...
}
/**
* 獲得類、父類的公共屬性
*/
@CallerSensitive
public Field[] getFields() throws SecurityException {
checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);
return copyFields(privateGetPublicFields(null));
}
/**
* 獲得類、父類的公共方法
*/
@CallerSensitive
public Method[] getMethods() throws SecurityException {
checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);
return copyMethods(privateGetPublicMethods());
}
/**
* 獲取公共的構造函數
*/
@CallerSensitive
public Constructor<?>[] getConstructors() throws SecurityException {
checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);
return copyConstructors(privateGetDeclaredConstructors(true));
}
@CallerSensitive
public Field getField(String name)
throws NoSuchFieldException, SecurityException {
checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);
Field field = getField0(name);
if (field == null) {
throw new NoSuchFieldException(name);
}
return field;
}
@CallerSensitive
public Method getMethod(String name, Class<?>... parameterTypes)
throws NoSuchMethodException, SecurityException {
checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);
Method method = getMethod0(name, parameterTypes, true);
if (method == null) {
throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes));
}
return method;
}
@CallerSensitive
public Constructor<T> getConstructor(Class<?>... parameterTypes)
throws NoSuchMethodException, SecurityException {
checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);
return getConstructor0(parameterTypes, Member.PUBLIC);
}
/**
* 獲得該類的所有內部類
*/
@CallerSensitive
public Class<?>[] getDeclaredClasses() throws SecurityException {
checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), false);
return getDeclaredClasses0();
}
/**
* 獲得該類的所有屬性
*/
@CallerSensitive
public Field[] getDeclaredFields() throws SecurityException {
checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true);
return copyFields(privateGetDeclaredFields(false));
}
/**
* 獲得該類的所有方法(不包括構造方法)
*/
@CallerSensitive
public Method[] getDeclaredMethods() throws SecurityException {
checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true);
return copyMethods(privateGetDeclaredMethods(false));
}
/**
* 獲得該類的所有構造方法
*/
@CallerSensitive
public Constructor<?>[] getDeclaredConstructors() throws SecurityException {
checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true);
return copyConstructors(privateGetDeclaredConstructors(false));
}
@CallerSensitive
public Field getDeclaredField(String name)
throws NoSuchFieldException, SecurityException {
checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true);
Field field = searchFields(privateGetDeclaredFields(false), name);
if (field == null) {
throw new NoSuchFieldException(name);
}
return field;
}
@CallerSensitive
public Method getDeclaredMethod(String name, Class<?>... parameterTypes)
throws NoSuchMethodException, SecurityException {
checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true);
Method method = searchMethods(privateGetDeclaredMethods(false), name, parameterTypes);
if (method == null) {
throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes));
}
return method;
}
@CallerSensitive
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
throws NoSuchMethodException, SecurityException {
checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true);
return getConstructor0(parameterTypes, Member.DECLARED);
}
/**
* 通過相對路徑獲取input流
*/
public InputStream getResourceAsStream(String name) {
name = resolveName(name);
ClassLoader cl = getClassLoader0();
if (cl==null) {
// A system class.
return ClassLoader.getSystemResourceAsStream(name);
}
return cl.getResourceAsStream(name);
}
/**
* 通過相對路徑獲取URL
*/
public java.net.URL getResource(String name) {
name = resolveName(name);
ClassLoader cl = getClassLoader0();
if (cl==null) {
// A system class.
return ClassLoader.getSystemResource(name);
}
return cl.getResource(name);
}
/** 下面數據Java安全相關內容,暫不考慮 */
/**
* 獲取類的ProtectionDomain(保護域)
*/
public java.security.ProtectionDomain getProtectionDomain() {
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkPermission(SecurityConstants.GET_PD_PERMISSION);
}
java.security.ProtectionDomain pd = getProtectionDomain0();
if (pd == null) {
if (allPermDomain == null) {
java.security.Permissions perms =
new java.security.Permissions();
perms.add(SecurityConstants.ALL_PERMISSION);
allPermDomain =
new java.security.ProtectionDomain(null, perms);
}
pd = allPermDomain;
}
return pd;
}
/**
* 移除了序列化相關程式碼
*/
/**
* 移除了枚舉、斷言部分程式碼
*/
/**
* 將obj強制轉化類型
*
* @since 1.5
*/
@SuppressWarnings("unchecked")
public T cast(Object obj) {
if (obj != null && !isInstance(obj))
throw new ClassCastException(cannotCastMsg(obj));
return (T) obj;
}
/**
* 將類轉化為clazz的子類
* @since 1.5
*/
@SuppressWarnings("unchecked")
public <U> Class<? extends U> asSubclass(Class<U> clazz) {
if (clazz.isAssignableFrom(this))
return (Class<? extends U>) this;
else
throw new ClassCastException(this.toString());
}
/**
* 移除註解部分程式碼
*/
}
待續
下一篇Java源碼賞析將會進行實例講解