首先看看Class 的声明:
public final class Class implements java.io.Serializable, java.lang.reflect.GenericDeclaration, java.lang.reflect.Type, java.lang.reflect.AnnotatedElement
Final 的,而且支持泛型,实现了某些接口。
/** * Instances of the class {@code Class} represent classes and * interfaces in a running Java application. An enum is a kind of * class and an annotation is a kind of interface. Every array also * belongs to a class that is reflected as a {@code Class} object * that is shared by all arrays with the same element type and number * of dimensions. The primitive Java types ({@code boolean}, * {@code byte}, {@code char}, {@code short}, * {@code int}, {@code long}, {@code float}, and * {@code double}), and the keyword {@code void} are also * represented as {@code Class} objects. */
通过注释可以看到,主要有这么几类。
接口, 枚举,注解,数组,java基本类型 都可以通过Class 间接得到。
/* * Constructor. Only the Java Virtual Machine creates Class * objects. */ private Class() {}
也就是说一般不能人为的实例化Class实例。
public String toString() { return (isInterface() ? "interface " : (isPrimitive() ? "" : "class ")) + getName(); }
toString 方法:
返回值:interface, class 或者是空串“”。java基本类型 返回值只有类型,不存在具体包名。
public static Class<?> forName(String className) throws ClassNotFoundException { return forName0(className, true, ClassLoader.getCallerClassLoader()); }
用于实例化某个JVM上的Class,ClassLoader.getCallerClassLoader() 返回调用该方法的ClassLoader。
在看看它的重载方法:
public static Class<?> forName(String name, boolean initialize, ClassLoader loader) throws ClassNotFoundException { if (loader == null) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { ClassLoader ccl = ClassLoader.getCallerClassLoader(); if (ccl != null) { sm.checkPermission( SecurityConstants.GET_CLASSLOADER_PERMISSION); } } } return forName0(name, initialize, loader); }
只是增加了security 检查,以及设置initialize 参数的能力。
这两个方法最终都调用了一个native 方法
private static native Class<?> forName0(String name, boolean initialize, ClassLoader loader) throws ClassNotFoundException;
在看看newInstate 方法
public T newInstance() throws InstantiationException, IllegalAccessException {// 检查该构造方法是不是public的, 如果是就直接调用newInstance0 if (System.getSecurityManager() != null) { checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader()); } return newInstance0(); }
private T newInstance0() throws InstantiationException, IllegalAccessException { // NOTE: the following code may not be strictly correct under // the current Java memory model. // Constructor lookup 检查该类不是Class 类,因为Class类只能有JVM实例化。 if (cachedConstructor == null) { if (this == Class.class) { throw new IllegalAccessException( "Can not call newInstance() on the Class for java.lang.Class" ); } try { //设置构造方法的参数为空数组,这就是而为什么用newInstance实例化类需要有一个为空的构造方法的原因。 Class<?>[] empty = {}; //获取构造参数为空的,构造方法 final Constructor<T> c = getConstructor0(empty, Member.DECLARED); //下面都是做一些security 检查和access设置 // Disable accessibility checks on the constructor // since we have to do the security check here anyway // (the stack depth is wrong for the Constructor's // security check to work) java.security.AccessController.doPrivileged( new java.security.PrivilegedAction<Void>() { public Void run() { c.setAccessible(true); return null; } }); cachedConstructor = c; } catch (NoSuchMethodException e) { throw new InstantiationException(getName()); } } Constructor<T> tmpConstructor = cachedConstructor; // Security check (same as in java.lang.reflect.Constructor) int modifiers = tmpConstructor.getModifiers(); if (!Reflection.quickCheckMemberAccess(this, modifiers)) { Class<?> caller = Reflection.getCallerClass(3); if (newInstanceCallerCache != caller) { Reflection.ensureMemberAccess(caller, this, null, modifiers); newInstanceCallerCache = caller; } } // Run constructor try {//实例化相应的独享 return tmpConstructor.newInstance((Object[])null); } catch (InvocationTargetException e) { Unsafe.getUnsafe().throwException(e.getTargetException()); // Not reached return null; } }
/** * Determines if the specified {@code Object} is assignment-compatible * with the object represented by this {@code Class}. This method is * the dynamic equivalent of the Java language {@code instanceof} * operator. The method returns {@code true} if the specified * {@code Object} argument is non-null and can be cast to the * reference type represented by this {@code Class} object without * raising a {@code ClassCastException.} It returns {@code false} * otherwise. .... */ public native boolean isInstance(Object obj);
isInstance 方法,通过注释可以知道该方法主要用于判断:参数obj 是否与调用者Class(某个类对应的Class)兼容。 简单一点的就是说 参数obj 能否 Cast 为调用者对应的类。
自身类.class.isInstance(自身实例或子类实例) 返回true
String s = new String("test");
System.out.println(Object.class.isInstance(s)); //true
String 可以cast 为object。
/** * Determines if the class or interface represented by this * {@code Class} object is either the same as, or is a superclass or * superinterface of, the class or interface represented by the specified * {@code Class} parameter. It returns {@code true} if so; * otherwise it returns {@code false}. If this {@code Class} * object represents a primitive type, this method returns * {@code true} if the specified {@code Class} parameter is * exactly this {@code Class} object; otherwise it returns * {@code false}. * ... */ public native boolean isAssignableFrom(Class<?> cls);
isAssignableFrom 与isInstance 方法类似只是参数不同。