Java反射类 - Method类源码解析

简介: Java反射类 - Method类源码解析

Java反射类 - Method类源码解析

一、Method简介与定义

1.1 Method简介

Method提供了对于在类或接口中单个方法的信息和访问,反射方法可能是一个类方法或实体方法(包含抽象方法)。

1.2 Method定义

public final class Method extends Executable {}

1.3 Method父类 Executable类

/*
* 方法和构造函数的公共功能的共享超类。
*/
public abstract sealed class Executable extends AccessibleObject
    implements Member, GenericDeclaration permits Constructor, Method {
    /*
    *{@code Parameter}对象的数组,表示由该对象表示的底层可执行文件的所有参数。如果可执行文件没有参数,则返回长度为0的数组
    */
    public Parameter[] getParameters() {}
    /*
    * 返回一个由注解数组组成的数组,这些注解以声明顺序表示由此对象表示的可执行文件的形式参数上的注解。
    * 合成参数和强制参数(参见下面的解释),例如内部类构造函数的外部“this”参数将在返回的数组中表示。
    * 如果可执行文件没有参数(即没有正式参数、没有合成参数和没有强制参数),将返回一个零长度的数组。
    * 如果可执行文件有一个或多个参数,则为每个参数返回一个长度为零的嵌套数组,不带注释。
    * 返回数组中包含的注释对象是可序列化的。此方法的调用者可以自由地修改返回的数组;
    * 它对返回给其他调用者的数组没有影响。
    * 编译器可以向方法的参数列表中添加在source中隐式声明的额外参数(“强制”),
    * 以及在source中既没有隐式声明也没有显式声明的参数(“合成”)。有关更多信息,请参见参数。
    *  注意,此方法返回的任何注释都是声明注释。
    */
    public abstract Annotation[][] getParameterAnnotations();
}

1.4 Method类中主要方法与属性

package java.lang.reflect;
import jdk.internal.access.SharedSecrets;
import jdk.internal.reflect.CallerSensitive;
import jdk.internal.reflect.MethodAccessor;
import jdk.internal.reflect.Reflection;
import jdk.internal.vm.annotation.ForceInline;
import jdk.internal.vm.annotation.IntrinsicCandidate;
import jdk.internal.vm.annotation.Stable;
import sun.reflect.annotation.ExceptionProxy;
import sun.reflect.annotation.TypeNotPresentExceptionProxy;
import sun.reflect.generics.repository.MethodRepository;
import sun.reflect.generics.factory.CoreReflectionFactory;
import sun.reflect.generics.factory.GenericsFactory;
import sun.reflect.generics.scope.MethodScope;
import sun.reflect.annotation.AnnotationType;
import sun.reflect.annotation.AnnotationParser;
import java.lang.annotation.Annotation;
import java.lang.annotation.AnnotationFormatError;
import java.nio.ByteBuffer;
import java.util.StringJoiner;
public final class Method extends Executable {
     /*
     * 返回表示声明由此对象表示的方法的类或接口的Class对象。
     */
     public Class<?> getDeclaringClass() {return clazz;}
     /*
     * 以字符串形式返回此method对象所表示的方法的名称。
     */
     public String getName() {}
     /*
     * @返回Java语言{@linkplain Modifier modifiers}用于这个对象所表示的可执行文件
     */
     public int getModifiers() {}
     /*
     * 返回一个TypeVariable对象数组,这些对象按照声明顺序表示由这个GenericDeclaration
     * 对象表示的泛型声明声明的类型变量。
     * 如果底层泛型声明没有声明类型变量,则返回长度为0的数组。
     */
     public TypeVariable<Method>[] getTypeParameters() {}
     /*
     * 返回一个Class对象,该对象表示由此method对象表示的方法的正式返回类型。
     */
     public Type getGenericReturnType() {}
    //返回方法按声明顺序的参数Class数组,没有则返回长度为0的数组
    public Class<?>[] getParameterTypes() {}
    //返回方法的参数个数
    public int getParameterCount() {}
    //返回方法按声明顺序的泛型参数类型数组
    public Type[] getGenericParameterTypes() {}
    //返回方法抛出的异常类对象数组
    public Class<?>[] getExceptionTypes() {}
    //返回方法抛出的异常Type数组
    public Type[] getGenericExceptionTypes() {}
    //比较两个Method是否一样,当两个方法由相同的类声明、相同的名称、相同的参数类型和相同的返回类型,则相等
    public boolean equals(Object obj) {}
    //返回方法的hashCode,由声明方法的类名和方法名称的异或计算而得
    public int hashCode() {}
    //返回方法的字符串表示
    public String toString() {}
    //返回方法的字符串表示(包含类型变量)
    public String toGenericString() {}
    //方法调用执行
    public Object invoke(Object obj, Object... args)throws IllegalAccessException, IllegalArgumentException,InvocationTargetException{}
    //是否是桥接方法, 泛型擦除后jvm生的方法
    public boolean isBridge() {}
    //方法是否有可变数量的参数
    public boolean isVarArgs() {}
    //方法是否是合成的
    public boolean isSynthetic() {}
    //方法是否是接口中默认实现方法
    public boolean isDefault() {}
    //返回当前方法实例代表的注解成员的默认值
    public Object getDefaultValue() {}
    //返回当前方法上指定类型的注解
    public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {}
    //返回当前方法上声明的所有注解
    public Annotation[] getDeclaredAnnotations()  {}
    //返回方法参数上的注解二维数组(多个参数的注解,每个参数可以有多个注解)
    public Annotation[][] getParameterAnnotations() {}
    //获取方法返回的AnnotatedType
    public AnnotatedType getAnnotatedReturnType() {}
}

目录
相关文章
|
3天前
|
Java
【专栏】Java中的反射机制与应用实例
【4月更文挑战第27天】本文探讨了Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性。反射通过Class、Constructor、Method和Field类实现。文中列举了反射的应用场景,如动态创建对象、调用方法、访问属性和处理注解,并提供了相关实例代码演示。
|
4天前
|
设计模式 Java Spring
来聊聊Java的反射机制(下)
来聊聊Java的反射机制(下)
7 0
|
5天前
|
XML 人工智能 Java
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
|
5天前
|
存储 安全 Java
Java并发编程中的高效数据结构:ConcurrentHashMap解析
【4月更文挑战第25天】在多线程环境下,高效的数据访问和管理是至关重要的。Java提供了多种并发集合来处理这种情境,其中ConcurrentHashMap是最广泛使用的一个。本文将深入分析ConcurrentHashMap的内部工作原理、性能特点以及它如何在保证线程安全的同时提供高并发性,最后将展示其在实际开发中的应用示例。
|
6天前
|
Java
Java输入输出流详细解析
Java输入输出流详细解析
Java输入输出流详细解析
|
6天前
|
Java
Java 反射
Java 反射
|
6天前
|
存储 Java C++
Java集合篇之深度解析Queue,单端队列、双端队列、优先级队列、阻塞队列
Java集合篇之深度解析Queue,单端队列、双端队列、优先级队列、阻塞队列
18 0
|
6天前
|
设计模式 Java 索引
由反射引出的Java动态代理与静态代理
由反射引出的Java动态代理与静态代理
12 0
|
6天前
|
存储 Java Shell
深入剖析Java中的反射,由浅入深,层层剥离!
深入剖析Java中的反射,由浅入深,层层剥离!
11 1
|
11天前
|
监控 Java 开发者
掌握 Java 反射和动态代理
【4月更文挑战第19天】Java反射和动态代理提供强大功能和灵活性。反射允许运行时检查和操作类,获取类信息、动态调用方法,但可能带来性能损失和降低代码可读性。动态代理则用于创建代理对象,实现透明性和横切关注点分离,常用于日志、权限检查等。两者结合能实现更复杂功能。掌握这些技术能提升代码的灵活性和可扩展性,但也需注意性能和可读性。通过学习和实践,能更好地构建高效软件系统。

推荐镜像

更多