java Class 类常用方法分析

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;
    }

你可能感兴趣的:(源码分析)