Class类是Java中保存类信息的实例。里面有各种反射的方法,已经类的信息,掌握它,熟悉它,有助于我们日常的反射编程。
Class是个泛型类,
public final class Class<T> implements java.io.Serializable,
GenericDeclaration,
Type,
AnnotatedElement {
Class 只有一个私有单参构造函数,一个final修饰的ClassLoader。只有jvm才能创建Class对象。
private Class(ClassLoader loader) {
classLoader = loader;
}
ClassLoader getClassLoader0() { return classLoader; }
private final ClassLoader classLoader;
toString 返回Class的类型(接口还是类)和名字。isInterface调用原生方法,根据class 信息字段,判断它的类型。
public String toString() {
return (isInterface() ? "interface " : (isPrimitive() ? "" : "class "))
+ getName();
}
public native boolean isInterface();
public native boolean isPrimitive();
返回所有修饰符为public的类或者接口的方法,包括了它的父类,父接口的。如果多个方法含有相同的方法名字和入参,那都会返回。如果当前的classLoader与该class 不是一个继承体系,会拒绝。
@CallerSensitive
public Method[] getMethods() throws SecurityException {
checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);
return copyMethods(privateGetPublicMethods());
}
与getMethods区别就是,不仅返回public修饰的方法,还有protected, default (package)
,private 。但是不包括继承来的,也就是都是自己声明的部分。
@CallerSensitive
public Method[] getDeclaredMethods() throws SecurityException {
checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true);
return copyMethods(privateGetDeclaredMethods(false));
}
返回getDeclaredMethods中,筛选出指定入参列表的方法。
@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;
}
class被声明为java.lang.Enum,或者父类是java.lang.Enum,
public boolean isEnum() {
return (this.getModifiers() & ENUM) != 0 &&
this.getSuperclass() == java.lang.Enum.class;
}