超详细的逐句介绍Java反射之Constructort类和Method类函数源码讲解(全)

news/2024/5/19 4:21:11 标签: Java, 反射, constructor

一、Constructort类和Method类

Constructort类构造函数提供有关类的单个构造函数的信息和对其的访问。Method类方法提供有关类或接口上的单个方法的信息和对其的访问。反映的方法可以是类方法或实例方法(包括抽象方法)。下面我将从源码的角度对这两个类进行详细介绍。

二、Constructort类源码介绍

Constructort类继承了Executable类

public final class Constructor<T> extends Executable {
}

下面定义了一些基本变量

	private Class<T>            clazz;
    private int                 slot;
    private Class<?>[]          parameterTypes;
    private Class<?>[]          exceptionTypes;
    private int                 modifiers;
    // Generics and annotations support
    private transient String    signature;
    // generic info repository; lazily initialized
    private transient ConstructorRepository genericInfo;
    private byte[]              annotations;
    private byte[]              parameterAnnotations;

定义泛型工厂

private GenericsFactory getFactory() {
        // create scope and factory
        return CoreReflectionFactory.make(this, ConstructorScope.make(this));
    }

定义了获取基本信息的方法

 ConstructorRepository getGenericInfo() {
        // lazily initialize repository if necessary
        if (genericInfo == null) {
            // create and cache generic info repository
            genericInfo =
                ConstructorRepository.make(getSignature(),
                                           getFactory());
        }
        return genericInfo; //return cached repository
    }

定义了一个转瞬即逝的构造地址

private volatile ConstructorAccessor constructorAccessor;

定义一个管理员的构造者

private Constructor<T>      root;

获取root权限

Executable getRoot() {
        return root;
    }

构造私有的重写方法

Constructor(Class<T> declaringClass,
                Class<?>[] parameterTypes,
                Class<?>[] checkedExceptions,
                int modifiers,
                int slot,
                String signature,
                byte[] annotations,
                byte[] parameterAnnotations) {
        this.clazz = declaringClass;
        this.parameterTypes = parameterTypes;
        this.exceptionTypes = checkedExceptions;
        this.modifiers = modifiers;
        this.slot = slot;
        this.signature = signature;
        this.annotations = annotations;
        this.parameterAnnotations = parameterAnnotations;
    }

定义复制方法

Constructor<T> copy() {
      
        if (this.root != null)
            throw new IllegalArgumentException("Can not copy a non-root Constructor");

        Constructor<T> res = new Constructor<>(clazz,
                                               parameterTypes,
                                               exceptionTypes, modifiers, slot,
                                               signature,
                                               annotations,
                                               parameterAnnotations);
        res.root = this;
        // Might as well eagerly propagate this if already present
        res.constructorAccessor = constructorAccessor;
        return res;
    }

定义是否含有通用信息

boolean hasGenericInformation() {
        return (getSignature() != null);
    }

获取注解信息

byte[] getAnnotationBytes() {
        return annotations;
    }

返回表示类或接口的 Class 对象,该类或接口声明了由此对象表示的可执行文件

public Class<T> getDeclaringClass() {
        return clazz;
    }

定义获取类或接口的 Class 对象的名称

public String getName() {
        return getDeclaringClass().getName();
    }

获取类或接口的 Class 对象的修饰符

public int getModifiers() {
        return modifiers;
    }

定义获取参数列表类型

public TypeVariable<Constructor<T>>[] getTypeParameters() {
      if (getSignature() != null) {
        return (TypeVariable<Constructor<T>>[])getGenericInfo().getTypeParameters();
      } else
          return (TypeVariable<Constructor<T>>[])new TypeVariable[0];
    }

获取具体参数类型

public Class<?>[] getParameterTypes() {
        return parameterTypes.clone();
    }

获取参数列表长度

public int getParameterCount() { return parameterTypes.length; }

获取类或者接口对象的参数列表

public Type[] getGenericParameterTypes() {
        return super.getGenericParameterTypes();
    }

获取其他类型

public Class<?>[] getExceptionTypes() {
        return exceptionTypes.clone();
    }

或接口对象其他类型

public Type[] getGenericExceptionTypes() {
        return super.getGenericExceptionTypes();
    }

判断是否相等方法

public boolean equals(Object obj) {
        if (obj != null && obj instanceof Constructor) {
            Constructor<?> other = (Constructor<?>)obj;
            if (getDeclaringClass() == other.getDeclaringClass()) {
                return equalParamTypes(parameterTypes, other.parameterTypes);
            }
        }
        return false;
    }

获取hash码

public int hashCode() {
        return getDeclaringClass().getName().hashCode();
    }

转化为字符串方法

public String toString() {
        return sharedToString(Modifier.constructorModifiers(),
                              false,
                              parameterTypes,
                              exceptionTypes);
    }
   void specificToStringHeader(StringBuilder sb) {
        sb.append(getDeclaringClass().getTypeName());
    }

用于获取类名或者接口名

    public String toGenericString() {
        return sharedToGenericString(Modifier.constructorModifiers(), false);
    }

    void specificToGenericStringHeader(StringBuilder sb) {
        specificToStringHeader(sb);
    }

定义一个新的实例

public T newInstance(Object ... initargs)
        throws InstantiationException, IllegalAccessException,
               IllegalArgumentException, InvocationTargetException
    {
        if (!override) {
            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
                Class<?> caller = Reflection.getCallerClass();
                checkAccess(caller, clazz, null, modifiers);
            }
        }
        if ((clazz.getModifiers() & Modifier.ENUM) != 0)
            throw new IllegalArgumentException("Cannot reflectively create enum objects");
        ConstructorAccessor ca = constructorAccessor;   // read volatile
        if (ca == null) {
            ca = acquireConstructorAccessor();
        }
        @SuppressWarnings("unchecked")
        T inst = (T) ca.newInstance(initargs);
        return inst;
    }

如果此可执行文件被声明为采用可变数量的参数,则返回 true;否则返回 false。

public boolean isVarArgs() {
        return super.isVarArgs();
    }

如果此可执行文件是合成结构,则返回 true;否则返回 false

public boolean isSynthetic() {
        return super.isSynthetic();
    }

构造地址的构造者,下面是具体实现类

ConstructorAccessor getConstructorAccessor() {
        return constructorAccessor;
    }
private ConstructorAccessor acquireConstructorAccessor() {
        ConstructorAccessor tmp = null;
        if (root != null) tmp = root.getConstructorAccessor();
        if (tmp != null) {
            constructorAccessor = tmp;
        } else {
            // Otherwise fabricate one and propagate it up to the root
            tmp = reflectionFactory.newConstructorAccessor(this);
            setConstructorAccessor(tmp);
        }

        return tmp;
    }

设置构造地址的构造者

void setConstructorAccessor(ConstructorAccessor accessor) {
        constructorAccessor = accessor;
        // Propagate up
        if (root != null) {
            root.setConstructorAccessor(accessor);
        }
    }

下面定义了一些获取状态的方法

int getSlot() {
        return slot;
    }

    String getSignature() {
        return signature;
    }

    byte[] getRawAnnotations() {
        return annotations;
    }

    byte[] getRawParameterAnnotations() {
        return parameterAnnotations;
    }

下面定义获取注解的方法

public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
        return super.getAnnotation(annotationClass);
    }

定义获取类或者接口的注解

public Annotation[] getDeclaredAnnotations()  {
        return super.getDeclaredAnnotations();
    }

获取多个类或者接口对象的多个注解

public Annotation[][] getParameterAnnotations() {
        return sharedGetParameterAnnotations(parameterTypes, parameterAnnotations);
    }

定义解决类或者接口没有匹配的解决方法

void handleParameterNumberMismatch(int resultLength, int numParameters) {
        Class<?> declaringClass = getDeclaringClass();
        if (declaringClass.isEnum() ||
            declaringClass.isAnonymousClass() ||
            declaringClass.isLocalClass() )
            return ; // Can't do reliable parameter counting
        else {
            if (!declaringClass.isMemberClass() || // top-level
                // Check for the enclosing instance parameter for
                // non-static member classes
                (declaringClass.isMemberClass() &&
                 ((declaringClass.getModifiers() & Modifier.STATIC) == 0)  &&
                 resultLength + 1 != numParameters) ) {
                throw new AnnotationFormatError(
                          "Parameter annotations don't match number of parameters");
            }
        }
    }

下面定义了获取注释类型,下面为具体实现类

public AnnotatedType getAnnotatedReturnType() {
        return getAnnotatedReturnType0(getDeclaringClass());
    }
public AnnotatedType getAnnotatedReceiverType() {
        if (getDeclaringClass().getEnclosingClass() == null)
            return super.getAnnotatedReceiverType();

        return TypeAnnotationParser.buildAnnotatedType(getTypeAnnotationBytes0(),
                sun.misc.SharedSecrets.getJavaLangAccess().
                        getConstantPool(getDeclaringClass()),
                this,
                getDeclaringClass(),
                getDeclaringClass().getEnclosingClass(),
                TypeAnnotation.TypeAnnotationTarget.METHOD_RECEIVER);
    }

三、Method类源码介绍

Method类继承了Executable

public final class Method extends Executable {
}

下面定义了一些变量

    private Class<?>            clazz;
    private int                 slot;
    private String              name;
    private Class<?>            returnType;
    private Class<?>[]          parameterTypes;
    private Class<?>[]          exceptionTypes;
    private int                 modifiers;
    private transient String              signature;
    private transient MethodRepository genericInfo;
    private byte[]              annotations;
    private byte[]              parameterAnnotations;
    private byte[]              annotationDefault;
    private volatile MethodAccessor methodAccessor;
    private Method              root;

获取通用签名

private String getGenericSignature() {return signature;}

获取类或者接口

private GenericsFactory getFactory() {
        // create scope and factory
        return CoreReflectionFactory.make(this, MethodScope.make(this));
    }

定义获取类或者的方法库

MethodRepository getGenericInfo() {
        // lazily initialize repository if necessary
        if (genericInfo == null) {
            // create and cache generic info repository
            genericInfo = MethodRepository.make(getGenericSignature(),
                                                getFactory());
        }
        return genericInfo; //return cached repository
    }

Method的内部构造方法

Method(Class<?> declaringClass,
           String name,
           Class<?>[] parameterTypes,
           Class<?> returnType,
           Class<?>[] checkedExceptions,
           int modifiers,
           int slot,
           String signature,
           byte[] annotations,
           byte[] parameterAnnotations,
           byte[] annotationDefault) {
        this.clazz = declaringClass;
        this.name = name;
        this.parameterTypes = parameterTypes;
        this.returnType = returnType;
        this.exceptionTypes = checkedExceptions;
        this.modifiers = modifiers;
        this.slot = slot;
        this.signature = signature;
        this.annotations = annotations;
        this.parameterAnnotations = parameterAnnotations;
        this.annotationDefault = annotationDefault;
    }

方法库的复制方法

Method copy() {
        if (this.root != null)
            throw new IllegalArgumentException("Can not copy a non-root Method");

        Method res = new Method(clazz, name, parameterTypes, returnType,
                                exceptionTypes, modifiers, slot, signature,
                                annotations, parameterAnnotations, annotationDefault);
        res.root = this;
        // Might as well eagerly propagate this if already present
        res.methodAccessor = methodAccessor;
        return res;
    }

定义获取权限方法

Executable getRoot() {
        return root;
    }

判断是否获得类或接口对象的信息

boolean hasGenericInformation() {
        return (getGenericSignature() != null);
    }

定义获取注解并存储进byte数组

byte[] getAnnotationBytes() {
        return annotations;
    }

返回表示类或接口的 Class 对象,该类或接口声明了由此对象表示的可执行文件。

public Class<?> getDeclaringClass() {
        return clazz;
    }

获取类或者接口对象名称

public String getName() {
        return name;
    }

定义获取修饰符函数

public int getModifiers() {
        return modifiers;
    }

获取类型列表

public TypeVariable<Method>[] getTypeParameters() {
        if (getGenericSignature() != null)
            return (TypeVariable<Method>[])getGenericInfo().getTypeParameters();
        else
            return (TypeVariable<Method>[])new TypeVariable[0];
    }

获取返回类型

public Class<?> getReturnType() {
        return returnType;
    }

返回一个 Type 对象,该对象表示此 Method 对象表示的方法的正式返回类型。

public Type getGenericReturnType() {
      if (getGenericSignature() != null) {
        return getGenericInfo().getReturnType();
      } else { return getReturnType();}
    }

返回一个 Class 对象数组,这些对象按声明顺序表示由此对象表示的可执行文件的形式参数类型。如果底层可执行文件不带参数,则返回长度为 0 的数组。

public Class<?>[] getParameterTypes() {
        return parameterTypes.clone();
    }

定义获取参数列表的个数

public int getParameterCount() { return parameterTypes.length; }

返回一个 Type 对象数组,这些对象按声明顺序表示由此对象表示的可执行文件的形式参数类型。

public Type[] getGenericParameterTypes() {
        return super.getGenericParameterTypes();
    }

返回一个 Class 对象数组,这些对象表示声明为由该对象表示的底层可执行文件抛出的异常类型。

public Class<?>[] getExceptionTypes() {
        return exceptionTypes.clone();
    }

返回一个 Type 对象数组,这些对象表示声明为由此可执行对象抛出的异常。

 public Type[] getGenericExceptionTypes() {
        return super.getGenericExceptionTypes();
    }

将此方法与指定的对象进行比较。

public boolean equals(Object obj) {
        if (obj != null && obj instanceof Method) {
            Method other = (Method)obj;
            if ((getDeclaringClass() == other.getDeclaringClass())
                && (getName() == other.getName())) {
                if (!returnType.equals(other.getReturnType()))
                    return false;
                return equalParamTypes(parameterTypes, other.parameterTypes);
            }
        }
        return false;
    }

获取哈希值

public int hashCode() {
        return getDeclaringClass().getName().hashCode() ^ getName().hashCode();
    }

获取描述此方法的字符串,下面函数是获取字符串头部

 public String toString() {
        return sharedToString(Modifier.methodModifiers(),
                              isDefault(),
                              parameterTypes,
                              exceptionTypes);
    }
void specificToStringHeader(StringBuilder sb) {
        sb.append(getReturnType().getTypeName()).append(' ');
        sb.append(getDeclaringClass().getTypeName()).append('.');
        sb.append(getName());
    }

返回描述此方法的字符串,包括类型参数

public String toGenericString() {
        return sharedToGenericString(Modifier.methodModifiers(), isDefault());
    }
void specificToGenericStringHeader(StringBuilder sb) {
        Type genRetType = getGenericReturnType();
        sb.append(genRetType.getTypeName()).append(' ');
        sb.append(getDeclaringClass().getTypeName()).append('.');
        sb.append(getName());
    }    

调用参数列表

public Object invoke(Object obj, Object... args)
        throws IllegalAccessException, IllegalArgumentException,
           InvocationTargetException
    {
        if (!override) {
            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
                Class<?> caller = Reflection.getCallerClass();
                checkAccess(caller, clazz, obj, modifiers);
            }
        }
        MethodAccessor ma = methodAccessor;             // read volatile
        if (ma == null) {
            ma = acquireMethodAccessor();
        }
        return ma.invoke(obj, args);
    }

判断是否是桥接器

 public boolean isBridge() {
        return (getModifiers() & Modifier.BRIDGE) != 0;
    }

判断此可执行文件被声明为采用可变数量的参数

public boolean isVarArgs() {
        return super.isVarArgs();
    }

判断此可执行文件是否是合成结构

public boolean isSynthetic() {
        return super.isSynthetic();
    }

判断是否是默认

 public boolean isDefault() {
        return ((getModifiers() & (Modifier.ABSTRACT | Modifier.PUBLIC | Modifier.STATIC)) ==
                Modifier.PUBLIC) && getDeclaringClass().isInterface();
    }

获取方法地址,下面是具体实现类

MethodAccessor getMethodAccessor() {
        return methodAccessor;
    }
private MethodAccessor acquireMethodAccessor() {
        MethodAccessor tmp = null;
        if (root != null) tmp = root.getMethodAccessor();
        if (tmp != null) {
            methodAccessor = tmp;
        } else {
            tmp = reflectionFactory.newMethodAccessor(this);
            setMethodAccessor(tmp);
        }

        return tmp;
    }

设置方法地址

void setMethodAccessor(MethodAccessor accessor) {
        methodAccessor = accessor;
        // Propagate up
        if (root != null) {
            root.setMethodAccessor(accessor);
        }
    }

获取默认值

public Object getDefaultValue() {
        if  (annotationDefault == null)
            return null;
        Class<?> memberType = AnnotationType.invocationHandlerReturnType(
            getReturnType());
        Object result = AnnotationParser.parseMemberValue(
            memberType, ByteBuffer.wrap(annotationDefault),
            sun.misc.SharedSecrets.getJavaLangAccess().
                getConstantPool(getDeclaringClass()),
            getDeclaringClass());
        if (result instanceof sun.reflect.annotation.ExceptionProxy)
            throw new AnnotationFormatError("Invalid default: " + this);
        return result;
    }

下面定义了获取注解的方法

public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
        return super.getAnnotation(annotationClass);
    }

返回直接出现在此元素上的注释,下面可以多个方法的注解

public Annotation[] getDeclaredAnnotations()  {
        return super.getDeclaredAnnotations();
    }
public Annotation[][] getParameterAnnotations() {
        return sharedGetParameterAnnotations(parameterTypes, parameterAnnotations);
    }

定义获取注解类型

public AnnotatedType getAnnotatedReturnType() {
        return getAnnotatedReturnType0(getGenericReturnType());
    }

定义解决类型不匹配的解决方法

void handleParameterNumberMismatch(int resultLength, int numParameters) {
        throw new AnnotationFormatError("Parameter annotations don't match number of parameters");
    }

http://www.niftyadmin.cn/n/1616235.html

相关文章

数学建模之线性规划(含MATLAB代码)

文章目录数学建模之线性规划1. 线性规划1.1 matlab中的标准形式1.2 可转换为线性规划问题2. 整数规划2.1 分支定界算法2.1.1 分支定界举例2.1.2 matlab代码实现2.1.3 intlinprog函数求解整数规划2.2 割平面算法2.2.1 matlab实现代码2.2.2 割平面算法应用2.3 匈牙利算法(0-1规划…

Channel.me:这是一个神奇的网站

电脑上的远程协助功能&#xff0c;相信不少人都用过&#xff0c;对于很多菜鸟级网民来说&#xff0c;让好朋友异地帮忙修电脑似乎很神奇&#xff0c;但是一旦授权给对方&#xff0c;只能看着他操作&#xff0c;缺少了交互的乐趣。今天介绍的Channel.me却能让身处异地的人同时访…

数学建模之层次分析法(含MATLAB代码)

数学建模层次分析法1. 层次分析法的基本原理和步骤1.1 层次单排序及一致性检验1.2 层次总排序及一致性检验2. matlab代码3. 应用过程举例4. 参考资料1. 层次分析法的基本原理和步骤 层次分析法的基本原理与步骤 人们在进行社会的、经济的以及科学管理领域问题的系统分析中&…

云存储平台Box.net获得8100万美元融资,估值超过6亿美元

据悉&#xff0c;美云存储平台Box.net刚刚以超过6亿的估值获得了D轮8100万美元的融资&#xff0c;投资方包括Salesforce&#xff0c;SAP&#xff0c;以及上一轮投资者Andreessen Horowitz等。 Box现有用户700万&#xff0c;存储文件数超过3亿&#xff0c;是一个集合作、社交和移…

超详细的逐句介绍Java反射之Field类和InvocationTargetException类函数源码讲解(全)

一、Field类和InvocationTargetException类 InvocationTargetException 是一个经过检查的异常&#xff0c;它包装了被调用的方法或构造函数抛出的异常。Field提供有关类或接口的单个​​字段的信息和动态访问。反射字段可以是类&#xff08;静态&#xff09;字段或实例字段。下…

编译原理:LL(1)文法判定,自顶向下语法分析(预测分析表法)

编译原理词法分析部分内容1. LL(1)文法判定 2. 自顶向下语法分析 3. 预测分析表的构造 4. 自顶向下预测分析算法

史蒂夫为什么总是穿圆领衫和牛仔裤

Walter Isaacson在即将面世的新书《乔布斯传记》中写到&#xff0c;在与乔布斯的一次谈话中才了解到他为什么总是穿着圆领衫和牛仔裤&#xff0c;原来是因为受索尼公司的影响。以下是Gawker’s Ryan Tate从Isaacson书中截取的摘要。 上世纪80年代&#xff0c;乔布斯参观了索尼的…

支持多个平台同时在线对接上位机网关

BL110是一款功能强大的PLC协议支持网关。它具有多种协议转换能力&#xff0c;包括Modbus RTU、Modbus TCP、DL/T645、IEC101、IEC104、BACnet IP、BACnet MS/TP等。 随着物联网技术的不断发展&#xff0c;PLC设备之间的互联和通信变得日益重要。然而&#xff0c;不同的PLC设备…