zoukankan      html  css  js  c++  java
  • Class 源码解读

    Class

    • 获取包信息
        /**
         *  获取此对象所在的包
         * @revised 9
         * @spec JPMS
         */
        public Package getPackage() {
            // 原始类型和数组无 Package
            if (isPrimitive() || isArray()) {
                return null;
            }
            final ClassLoader cl = getClassLoader0();
            return cl != null ? cl.definePackage(this)
                    : BootLoader.definePackage(this);
        }
    
        /**
         *  返回此类的全限定包名
         *
         * @since 9
         * @spec JPMS
         * @jls 6.7  Fully Qualified Names
         */
        public String getPackageName() {
            String pn = this.packageName;
            if (pn == null) {
                Class<?> c = this;
                // 1)获取数组的最底层组件类型
                while (c.isArray()) {
                    c = c.getComponentType();
                }
                // 2)如果是原始类型
                if (c.isPrimitive()) {
                    pn = "java.lang";
                } else {
                    // 3)获取组件名称
                    final String cn = c.getName();
                    // 尝试截取包名称
                    final int dot = cn.lastIndexOf('.');
                    pn = dot != -1 ? cn.substring(0, dot).intern() : "";
                }
                // 缓存包名称
                this.packageName = pn;
            }
            return pn;
        }
    
    • 获取父类
        /**
         *  读取此类型的父类 Class
         */
        @HotSpotIntrinsicCandidate
        public native Class<? super T> getSuperclass();
    
    • 获取所实现的接口
        /**
         *  0)按声明顺序返回此类直接实现的所有接口
         *  1)未直接实现任何接口,则返回长度为 0 的数组
         *  2)原始类型返回长度为 0 的数组
         *  3)数组返回 Cloneable 和 Serializable 组成的数组
         */
        public Class<?>[] getInterfaces() {
            // defensively copy before handing over to user code
            return getInterfaces(true);
        }
    
        private Class<?>[] getInterfaces(boolean cloneArray) {
            final 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 if requested
                return cloneArray ? interfaces.clone() : interfaces;
            }
        }
    
        private native Class<?>[] getInterfaces0();
    
    • 读取成员类及接口
        /**
         *  返回此类及其父类中定义的所有 public 成员类和接口。
         *  未定义成员类和接口、原始数据类型、数组都返回长度为 0 的 Class[]。
         * @since 1.1
         */
        @CallerSensitive
        public Class<?>[] getClasses() {
            final SecurityManager sm = System.getSecurityManager();
            if (sm != null) {
                checkMemberAccess(sm, Member.PUBLIC, Reflection.getCallerClass(), false);
            }
    
            return java.security.AccessController.doPrivileged(
                    (PrivilegedAction<Class<?>[]>) () -> {
                        final List<Class<?>> list = new ArrayList<>();
                        Class<?> currentClass = Class.this;
                        while (currentClass != null) {
                            // 获取当前类中定义的所有 public 成员类和接口
                            for (final Class<?> m : currentClass.getDeclaredClasses()) {
                                if (Modifier.isPublic(m.getModifiers())) {
                                    list.add(m);
                                }
                            }
                            // 递归处理其父类
                            currentClass = currentClass.getSuperclass();
                        }
                        return list.toArray(new Class<?>[0]);
                    });
        }
    
        /**
         *  读取当前类中定义的所有成员类和接口
         * @since 1.1
         */
        @CallerSensitive
        public Class<?>[] getDeclaredClasses() throws SecurityException {
            final SecurityManager sm = System.getSecurityManager();
            if (sm != null) {
                checkMemberAccess(sm, Member.DECLARED, Reflection.getCallerClass(), false);
            }
            return getDeclaredClasses0();
        }
    
        private native Class<?>[]   getDeclaredClasses0();
    
    • 读取构造函数
        /**
         *  读取此类中定义的所有 public 构造函数
         * @since 1.1
         */
        @CallerSensitive
        public Constructor<?>[] getConstructors() throws SecurityException {
            final SecurityManager sm = System.getSecurityManager();
            if (sm != null) {
                checkMemberAccess(sm, Member.PUBLIC, Reflection.getCallerClass(), true);
            }
            return copyConstructors(privateGetDeclaredConstructors(true));
        }
    
        private static ReflectionFactory getReflectionFactory() {
            if (reflectionFactory == null) {
                reflectionFactory =
                        java.security.AccessController.doPrivileged
                        (new ReflectionFactory.GetReflectionFactoryAction());
            }
            return reflectionFactory;
        }
    
        // Returns an array of "root" constructors. These Constructor
        // objects must NOT be propagated to the outside world, but must
        // instead be copied via ReflectionFactory.copyConstructor.
        private Constructor<T>[] privateGetDeclaredConstructors(boolean publicOnly) {
            Constructor<T>[] res;
            final ReflectionData<T> rd = reflectionData();
            if (rd != null) {
                // 只读取 public 构造函数还是所有声明的构造函数
                res = publicOnly ? rd.publicConstructors : rd.declaredConstructors;
                if (res != null) {
                    return res;
                }
            }
            // No cached value available; request value from VM
            // 1)如果是接口
            if (isInterface()) {
                res = (Constructor<T>[]) new Constructor<?>[0];
            } else {
                res = getDeclaredConstructors0(publicOnly);
            }
            if (rd != null) {
                if (publicOnly) {
                    rd.publicConstructors = res;
                } else {
                    rd.declaredConstructors = res;
                }
            }
            return res;
        }
    
        private native Constructor<T>[] getDeclaredConstructors0(boolean publicOnly);
    
        /**
         *  读取带有指定类型参数列表的 public 构造函数
         * @param parameterTypes    参数类型列表
         * @since 1.1
         */
        @CallerSensitive
        public Constructor<T> getConstructor(Class<?>... parameterTypes)
                throws NoSuchMethodException, SecurityException
        {
            final SecurityManager sm = System.getSecurityManager();
               if (sm != null) {
                checkMemberAccess(sm, Member.PUBLIC, Reflection.getCallerClass(), true);
            }
            return getReflectionFactory().copyConstructor(
                    getConstructor0(parameterTypes, Member.PUBLIC));
        }
    
        /**
         *  读取指定带有指定参数类型列表的构造函数
         *
         * @param parameterTypes    参数类型列表
         * @param which 
         */
        private Constructor<T> getConstructor0(Class<?>[] parameterTypes,
                int which) throws NoSuchMethodException
        {
            final ReflectionFactory fact = getReflectionFactory();
            // 读取所有 public 构造函数
            final Constructor<T>[] constructors = privateGetDeclaredConstructors(which == Member.PUBLIC);
            for (final Constructor<T> constructor : constructors) {
                // 数组内容相同
                if (arrayContentsEq(parameterTypes,
                        fact.getExecutableSharedParameterTypes(constructor))) {
                    return constructor;
                }
            }
            throw new NoSuchMethodException(methodToString("<init>", parameterTypes));
        }
    
        private static boolean arrayContentsEq(Object[] a1, Object[] a2) {
            if (a1 == null) {
                return a2 == null || a2.length == 0;
            }
    
            if (a2 == null) {
                return a1.length == 0;
            }
    
            if (a1.length != a2.length) {
                return false;
            }
    
            for (int i = 0; i < a1.length; i++) {
                if (a1[i] != a2[i]) {
                    return false;
                }
            }
    
            return true;
        }
    
        /**
         *  读取此类中定义的所有构造函数
         * @since 1.1
         */
        @CallerSensitive
        public Constructor<?>[] getDeclaredConstructors() throws SecurityException {
            final SecurityManager sm = System.getSecurityManager();
            if (sm != null) {
                checkMemberAccess(sm, Member.DECLARED, Reflection.getCallerClass(), true);
            }
            return copyConstructors(privateGetDeclaredConstructors(false));
        }
    
        private static <U> Constructor<U>[] copyConstructors(Constructor<U>[] arg) {
            final Constructor<U>[] out = arg.clone();
            final ReflectionFactory fact = getReflectionFactory();
            for (int i = 0; i < out.length; i++) {
                out[i] = fact.copyConstructor(out[i]);
            }
            return out;
        }
    
        /**
         *  读取带有指定类型参数列表的 public 构造函数
         *
         * @return  指定类型的参数列表
         * @since 1.1
         */
        @CallerSensitive
        public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
                throws NoSuchMethodException, SecurityException
        {
            final SecurityManager sm = System.getSecurityManager();
            if (sm != null) {
                checkMemberAccess(sm, Member.DECLARED, Reflection.getCallerClass(), true);
            }
    
            return getReflectionFactory().copyConstructor(
                    getConstructor0(parameterTypes, Member.DECLARED));
        }
    
    • 读取方法
        /**
         *  读取此类中定义的所有 public 方法,包括递归从父类和父接口中继承的 public 方法
         * @since 1.1
         */
        @CallerSensitive
        public Method[] getMethods() throws SecurityException {
            final SecurityManager sm = System.getSecurityManager();
            if (sm != null) {
                checkMemberAccess(sm, Member.PUBLIC, Reflection.getCallerClass(), true);
            }
            return copyMethods(privateGetPublicMethods());
        }
    
        // Returns an array of "root" methods. These Method objects must NOT
        // be propagated to the outside world, but must instead be copied
        // via ReflectionFactory.copyMethod.
        private Method[] privateGetPublicMethods() {
            Method[] res;
            // 1)尝试从缓存中读取
            final ReflectionData<T> rd = reflectionData();
            if (rd != null) {
                res = rd.publicMethods;
                if (res != null) {
                    return res;
                }
            }
    
            // 2)无缓存,读取此类中声明的所有 public 方法
            final PublicMethods pms = new PublicMethods();
            for (final Method m : privateGetDeclaredMethods(/* publicOnly */ true)) {
                pms.merge(m);
            }
            
            // 3)递归处理父类中的 public 方法
            final Class<?> sc = getSuperclass();
            if (sc != null) {
                for (final Method m : sc.privateGetPublicMethods()) {
                    pms.merge(m);
                }
            }
            // 4)递归处理父接口
            for (final Class<?> intf : getInterfaces(/* cloneArray */ false)) {
                for (final Method m : intf.privateGetPublicMethods()) {
                    // static interface methods are not inherited
                    if (!Modifier.isStatic(m.getModifiers())) {
                        pms.merge(m);
                    }
                }
            }
    
            res = pms.toArray();
            // 如果启用了缓存则写入
            if (rd != null) {
                rd.publicMethods = res;
            }
            return res;
        }
    
        private static Method[] copyMethods(Method[] arg) {
            final Method[] out = new Method[arg.length];
            final ReflectionFactory fact = getReflectionFactory();
            for (int i = 0; i < arg.length; i++) {
                out[i] = fact.copyMethod(arg[i]);
            }
            return out;
        }
    
        /**
         *  读取名称为 name,并带有指定参数列表的方法
         *
         * @param name  方法的名称
         * @param parameterTypes    参数类型列表
         * @since 1.1
         */
        @CallerSensitive
        public Method getMethod(String name, Class<?>... parameterTypes)
                throws NoSuchMethodException, SecurityException {
            Objects.requireNonNull(name);
            final SecurityManager sm = System.getSecurityManager();
            if (sm != null) {
                checkMemberAccess(sm, Member.PUBLIC, Reflection.getCallerClass(), true);
            }
            final Method method = getMethod0(name, parameterTypes);
            if (method == null) {
                throw new NoSuchMethodException(methodToString(name, parameterTypes));
            }
            return getReflectionFactory().copyMethod(method);
        }
    
        // Returns a "root" Method object. This Method object must NOT
        // be propagated to the outside world, but must instead be copied
        // via ReflectionFactory.copyMethod.
        private Method getMethod0(String name, Class<?>[] parameterTypes) {
            final PublicMethods.MethodList res = getMethodsRecursive(
                    name,
                    parameterTypes == null ? EMPTY_CLASS_ARRAY : parameterTypes,
                            /* includeStatic */ true);
            return res == null ? null : res.getMostSpecific();
        }
    
        // Returns a list of "root" Method objects. These Method objects must NOT
        // be propagated to the outside world, but must instead be copied
        // via ReflectionFactory.copyMethod.
        private PublicMethods.MethodList getMethodsRecursive(String name,
                Class<?>[] parameterTypes,
                boolean includeStatic) {
            // 1)读取所有声明的 public 方法
            final Method[] methods = privateGetDeclaredMethods(/* publicOnly */ true);
            PublicMethods.MethodList res = PublicMethods.MethodList
                    .filter(methods, name, parameterTypes, includeStatic);
            // 找到匹配方法,则直接返回
            if (res != null) {
                return res;
            }
    
            // 递归从父类中查找
            final Class<?> sc = getSuperclass();
            if (sc != null) {
                res = sc.getMethodsRecursive(name, parameterTypes, includeStatic);
            }
    
            // 递归从接口中查找
            for (final Class<?> intf : getInterfaces(/* cloneArray */ false)) {
                res = PublicMethods.MethodList.merge(
                        res, intf.getMethodsRecursive(name, parameterTypes,
                                /* includeStatic */ false));
            }
    
            return res;
        }
    
        /**
         *  读取此类中定义的所有方法
         * @since 1.1
         */
        @CallerSensitive
        public Method[] getDeclaredMethods() throws SecurityException {
            final SecurityManager sm = System.getSecurityManager();
            if (sm != null) {
                checkMemberAccess(sm, Member.DECLARED, Reflection.getCallerClass(), true);
            }
            return copyMethods(privateGetDeclaredMethods(false));
        }
    
        // Returns an array of "root" methods. These Method objects must NOT
        // be propagated to the outside world, but must instead be copied
        // via ReflectionFactory.copyMethod.
        private Method[] privateGetDeclaredMethods(boolean publicOnly) {
            Method[] res;
            // 1)尝试从缓存中读取
            final ReflectionData<T> rd = reflectionData();
            if (rd != null) {
                res = publicOnly ? rd.declaredPublicMethods : rd.declaredMethods;
                if (res != null) {
                    return res;
                }
            }
            // 从 VM 中查找结果
            res = Reflection.filterMethods(this, getDeclaredMethods0(publicOnly));
            // 如果存在缓存,则写入
            if (rd != null) {
                if (publicOnly) {
                    rd.declaredPublicMethods = res;
                } else {
                    rd.declaredMethods = res;
                }
            }
            return res;
        }
    
        /**
         *  读取此类中名称为 name 并且具有指定类型参数列表的方法
         *
         * @param name  方法的名称
         * @param parameterTypes    参数类型列表
         * @since 1.1
         */
        @CallerSensitive
        public Method getDeclaredMethod(String name, Class<?>... parameterTypes)
                throws NoSuchMethodException, SecurityException {
            Objects.requireNonNull(name);
            final SecurityManager sm = System.getSecurityManager();
            if (sm != null) {
                checkMemberAccess(sm, Member.DECLARED, Reflection.getCallerClass(), true);
            }
            final Method method = searchMethods(privateGetDeclaredMethods(false), name, parameterTypes);
            if (method == null) {
                throw new NoSuchMethodException(methodToString(name, parameterTypes));
            }
            return getReflectionFactory().copyMethod(method);
        }
    
        // This method does not copy the returned Method object!
        private static Method searchMethods(Method[] methods,
                String name,
                Class<?>[] parameterTypes)
        {
            final ReflectionFactory fact = getReflectionFactory();
            Method res = null;
            for (final Method m : methods) {
                // 方法名称一致 && 参数类型列表一致 && 返回值类型兼容
                if (m.getName().equals(name)
                        && arrayContentsEq(parameterTypes,
                                fact.getExecutableSharedParameterTypes(m))
                        && (res == null
                        || res.getReturnType() != m.getReturnType()
                        && res.getReturnType().isAssignableFrom(m.getReturnType()))) {
                    res = m;
                }
            }
            return res;
        }
    
    • 读取属性
        /**
         *  返回此类及其递归父类和接口中定义的所有 public 字段
         */
        @CallerSensitive
        public Field[] getFields() throws SecurityException {
            final SecurityManager sm = System.getSecurityManager();
            if (sm != null) {
                checkMemberAccess(sm, Member.PUBLIC, Reflection.getCallerClass(), true);
            }
            return copyFields(privateGetPublicFields());
        }
    
        private static Field[] copyFields(Field[] arg) {
            final Field[] out = new Field[arg.length];
            final ReflectionFactory fact = getReflectionFactory();
            for (int i = 0; i < arg.length; i++) {
                out[i] = fact.copyField(arg[i]);
            }
            return out;
        }
    
        // Returns an array of "root" fields. These Field objects must NOT
        // be propagated to the outside world, but must instead be copied
        // via ReflectionFactory.copyField.
        private Field[] privateGetPublicFields() {
            Field[] res;
            // 尝试从缓存中读取
            final ReflectionData<T> rd = reflectionData();
            if (rd != null) {
                res = rd.publicFields;
                if (res != null) {
                    return res;
                }
            }
    
            final LinkedHashSet<Field> fields = new LinkedHashSet<>();
    
            // 此类中定义的 public 属性
            addAll(fields, privateGetDeclaredFields(true));
    
            // 递归的接口中
            for (final Class<?> si : getInterfaces()) {
                addAll(fields, si.privateGetPublicFields());
            }
    
            // 递归的父类中
            final Class<?> sc = getSuperclass();
            if (sc != null) {
                addAll(fields, sc.privateGetPublicFields());
            }
    
            res = fields.toArray(new Field[0]);
            if (rd != null) {
                rd.publicFields = res;
            }
            return res;
        }
    
        // Returns an array of "root" fields. These Field objects must NOT
        // be propagated to the outside world, but must instead be copied
        // via ReflectionFactory.copyField.
        private Field[] privateGetDeclaredFields(boolean publicOnly) {
            Field[] res;
            // 尝试从缓存中读取
            final ReflectionData<T> rd = reflectionData();
            if (rd != null) {
                res = publicOnly ? rd.declaredPublicFields : rd.declaredFields;
                if (res != null) {
                    return res;
                }
            }
            // 从 JVM 中读取
            res = Reflection.filterFields(this, getDeclaredFields0(publicOnly));
            if (rd != null) {
                if (publicOnly) {
                    rd.declaredPublicFields = res;
                } else {
                    rd.declaredFields = res;
                }
            }
            return res;
        }
    
        private native Field[]       getDeclaredFields0(boolean publicOnly);
    
        /**
         *  读取指定名称的 public 字段
         * @param name  字段名称
         * @since 1.1
         */
        @CallerSensitive
        public Field getField(String name)
                throws NoSuchFieldException, SecurityException {
            Objects.requireNonNull(name);
            final SecurityManager sm = System.getSecurityManager();
            if (sm != null) {
                checkMemberAccess(sm, Member.PUBLIC, Reflection.getCallerClass(), true);
            }
            final Field field = getField0(name);
            if (field == null) {
                throw new NoSuchFieldException(name);
            }
            return getReflectionFactory().copyField(field);
        }
    
        // Returns a "root" Field object. This Field object must NOT
        // be propagated to the outside world, but must instead be copied
        // via ReflectionFactory.copyField.
        private Field getField0(String name) {
            // Note: the intent is that the search algorithm this routine
            // uses be equivalent to the ordering imposed by
            // privateGetPublicFields(). It fetches only the declared
            // public fields for each class, however, to reduce the number
            // of Field objects which have to be created for the common
            // case where the field being requested is declared in the
            // class which is being queried.
            Field res;
            // Search declared public fields
            if ((res = searchFields(privateGetDeclaredFields(true), name)) != null) {
                return res;
            }
            // Direct superinterfaces, recursively
            final Class<?>[] interfaces = getInterfaces(/* cloneArray */ false);
            for (final Class<?> c : interfaces) {
                if ((res = c.getField0(name)) != null) {
                    return res;
                }
            }
            // Direct superclass, recursively
            if (!isInterface()) {
                final Class<?> c = getSuperclass();
                if (c != null) {
                    if ((res = c.getField0(name)) != null) {
                        return res;
                    }
                }
            }
            return null;
        }
    
        // This method does not copy the returned Field object!
        private static Field searchFields(Field[] fields, String name) {
            for (final Field field : fields) {
                // 当前字段的名称和 name 相等
                if (field.getName().equals(name)) {
                    return field;
                }
            }
            return null;
        }
    
        /**
         *  读取此类中直接定义的所有字段
         * @since 1.1
         */
        @CallerSensitive
        public Field[] getDeclaredFields() throws SecurityException {
            final SecurityManager sm = System.getSecurityManager();
            if (sm != null) {
                checkMemberAccess(sm, Member.DECLARED, Reflection.getCallerClass(), true);
            }
            return copyFields(privateGetDeclaredFields(false));
        }
    
        private static Field[] copyFields(Field[] arg) {
            final Field[] out = new Field[arg.length];
            final ReflectionFactory fact = getReflectionFactory();
            for (int i = 0; i < arg.length; i++) {
                out[i] = fact.copyField(arg[i]);
            }
            return out;
        }
    
        /**
         *  读取此类中指定名称的字段
         *
         * @param name  字段名称
         * @since 1.1
         */
        @CallerSensitive
        public Field getDeclaredField(String name)
                throws NoSuchFieldException, SecurityException {
            Objects.requireNonNull(name);
            final SecurityManager sm = System.getSecurityManager();
            if (sm != null) {
                checkMemberAccess(sm, Member.DECLARED, Reflection.getCallerClass(), true);
            }
            final Field field = searchFields(privateGetDeclaredFields(false), name);
            if (field == null) {
                throw new NoSuchFieldException(name);
            }
            return getReflectionFactory().copyField(field);
        }
    
    • 读取注解
        /**
         *  读取此类上保留策略为 RetentionPolicy.RUNTIME 的所有直接注解,
         *  递归读取父类中保留策略为 RetentionPolicy.RUNTIME 并且带有 @Inherited 的所有注解
         *  顶层父类的注解优先读取。
         * @since 1.5
         */
        @Override
        public Annotation[] getAnnotations() {
            return AnnotationParser.toArray(annotationData().annotations);
        }
    
        /**
         *  读取指定类型的注解
         */
        @SuppressWarnings("unchecked")
        public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {
            Objects.requireNonNull(annotationClass);
    
            return (A) annotationData().annotations.get(annotationClass);
        }
    
        /**
         * 读取此类上保留策略为 RetentionPolicy.RUNTIME 的所有直接注解
         */
        @Override
        public Annotation[] getDeclaredAnnotations()  {
            return AnnotationParser.toArray(annotationData().declaredAnnotations);
        }
    
        /**
         * 读取此类上保留策略为 RetentionPolicy.RUNTIME 的指定类型的注解
         * @since 1.8
         */
        @Override
        @SuppressWarnings("unchecked")
        public <A extends Annotation> A getDeclaredAnnotation(Class<A> annotationClass) {
            Objects.requireNonNull(annotationClass);
    
            return (A) annotationData().declaredAnnotations.get(annotationClass);
        }
    
        /**
         *  获取此类直接的或间接的指定类型的所有注解
         * @since 1.8
         */
        @Override
        public <A extends Annotation> A[] getDeclaredAnnotationsByType(Class<A> annotationClass) {
            Objects.requireNonNull(annotationClass);
            return AnnotationSupport.getDirectlyAndIndirectlyPresent(annotationData().declaredAnnotations,
                    annotationClass);
        }
    
  • 相关阅读:
    JDK历史版本下载
    安装cocoapods及相关问题解决
    使用spring注解@Controller @Service @Repository简化配置
    自己动手编写spring IOC源码
    利用反射手写代码实现spring AOP
    浅谈系统架构<一>
    spring 声明式事务管理详解
    eclipse中SSH三大框架环境搭建<二>
    eclipse中SSH三大框架环境搭建<三>
    轻松理解spring IOC
  • 原文地址:https://www.cnblogs.com/zhuxudong/p/10505594.html
Copyright © 2011-2022 走看看