Java反射(Method)(三)

简介: 日常开发中,我们可使用反射获取JavaBean的方法信息,而描述属性信息的就是Java Method,Method类同样位于java.lang.reflect包下。

前言

image (1).png
日常开发中,我们可使用反射获取JavaBean的方法信息,而描述属性信息的就是Java Method,Method类同样位于java.lang.reflect包下。

Method

Method提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法),如果你想要通过反射调用类的私有方法时,要先在这个私有方法对应的Method对象上调用setAccessible来取消对这个方法的访问检查,再调用invoke方法来执行这个私有方法。

/**
* A {@code Method} provides information about, and access to, a single method
* on a class or interface.  The reflected method may be a class method
* or an instance method (including an abstract method).
*
* <p>A {@code Method} permits widening conversions to occur when matching the
* actual parameters to invoke with the underlying method's formal
* parameters, but it throws an {@code IllegalArgumentException} if a
* narrowing conversion would occur.
*
* @see Member
* @see java.lang.Class
* @see java.lang.Class#getMethods()
* @see java.lang.Class#getMethod(String, Class[])
* @see java.lang.Class#getDeclaredMethods()
* @see java.lang.Class#getDeclaredMethod(String, Class[])
*
* @author Kenneth Russell
* @author Nakul Saraiya
*/
public final class Method extends Executable {
    //.....
}

getModifiers

  • 以整数形式返回由此Method对象表示的字段的Java语言修饰符(例如private、final、static等)。
@Data
public class User {
    private String name;
    
    private int age;
    
    public void print(String name) {
        if (null == name) {
            return;
        }
        if (name.equals(this.name)) {
            System.out.println(this.age);
        }
    }
}

public static void main(String[] args) throws Exception {
    
    Method method = User.class.getMethod("print", String.class);

    // public
    System.out.println(Modifier.toString(method.getModifiers()));

}

getReturnType

  • 返回一个Class对象,该对象描述了此Method对象所表示的方法的正式返回类型。
    class User {

        private String name;

        private int age;

        public int getAge(String name) {
            if (null == name) {
                return 0;
            }
            if (name.equals(this.name)) {
                return this.age;
            }
            return 0;
        }
    }

    public static void main(String[] args) throws Exception {

        Method method = User.class.getMethod("getAge", String.class);
        // int
        System.out.println(method.getReturnType());

    }

getName

  • 以String形式返回此Method对象表示的方法名称。
class User {

        private String name;

        private int age;

        public int getAge(String name) {
            if (null == name) {
                return 0;
            }
            if (name.equals(this.name)) {
                return this.age;
            }
            return 0;
        }
    }

    public static void main(String[] args) throws Exception {

        Method method = User.class.getMethod("getAge", String.class);

        // getAge
        System.out.println(method.getName());
    }

getParameterTypes

  • 按照声明顺序返回Class对象的数组,这些对象描述了此Method对象所表示的方法的形参类型。如果底层方法不带参数,则返回长度为0的数组。
    public static void main(String[] args) throws Exception {

        Method method = User.class.getMethod("getAge", String.class);

        // java.lang.String
        Stream.of(method.getParameterTypes()).forEach(t-> System.out.println(t.getName()));
    }

    class User {

        private String name;

        private int age;

        public int getAge(String name) {
            if (null == name) {
                return 0;
            }
            if (name.equals(this.name)) {
                return this.age;
            }
            return 0;
        }
    }

getExceptionTypes

  • 返回Class对象的数组,这些对象描述了声明将此Method对象表示的底层方法抛出的异常类型。如果此方法没有在其throws子句中声明异常,则返回长度为0的数组。
 public static void main(String[] args) throws Exception {

        Method method = User.class.getMethod("getAge", String.class);

         // io.terminus.common.exception.ServiceException
        Stream.of(method.getExceptionTypes()).forEach(t-> System.out.println(t.getName()));
    }

    class User {

        private String name;

        private int age;

        public int getAge(String name) throws ServiceException {
            if (null == name) {
                return 0;
            }
            if (name.equals(this.name)) {
                return this.age;
            }
            return 0;
        }
    }

getDeclaringClass

  • 返回方法所在的类
    public static void main(String[] args) throws Exception {

        Method method = User.class.getMethod("getAge", String.class);

        // class cn.gov.zcy.item.Test$User
        System.out.println(method.getDeclaringClass());
    }

    class User {

        private String name;

        private int age;

        public int getAge(String name) throws ServiceException {
            if (null == name) {
                return 0;
            }
            if (name.equals(this.name)) {
                return this.age;
            }
            return 0;
        }
    }

invoke

  • 对带有指定参数的指定对象调用由此Method对象表示的底层方法。
  • 个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。
  • 如果底层方法是静态的,那么可以忽略指定的obj参数。该参数可以为null。
  • 如果底层方法所需的形参数为 0,则所提供的args数组长度可以为0或null。
  • 如果底层方法是实例方法,则使用动态方法查找来调用它,这一点记录在Java Language Specification, Second Edition 的第 15.12.4.4 节中;在发生基于目标对象的运行时类型的重写时更应该这样做。
  • 如果底层方法是静态的,并且尚未初始化声明此方法的类,则会将其初始化。
    public static void main(String[] args) throws Exception {

        User user = new User();

        Method setAgeMethod = user.getClass().getMethod("setAge", int.class);
        Method setNameMethod = user.getClass().getMethod("setName", String.class);
        setAgeMethod.invoke(user, 22);
        setNameMethod.invoke(user, "晓断");

        // User(name=晓断, age=22)
        System.out.println(user);

    }

    @ToString
    static
    class User {

        private String name;

        private int age;

        public void setAge(int age) {
            this.age = age;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
目录
相关文章
|
28天前
|
监控 Java
Java基础——反射
本文介绍了Java反射机制的基本概念和使用方法,包括`Class`类的使用、动态加载类、获取方法和成员变量信息、方法反射操作、以及通过反射了解集合泛型的本质。同时,文章还探讨了动态代理的概念及其应用,通过实例展示了如何利用动态代理实现面向切面编程(AOP),例如为方法执行添加性能监控。
|
1月前
|
Java
Java的反射
Java的反射。
29 2
|
2月前
|
存储 Java
[Java]反射
本文详细介绍了Java反射机制的基本概念、使用方法及其注意事项。首先解释了反射的定义和类加载过程,接着通过具体示例展示了如何使用反射获取和操作类的构造方法、方法和变量。文章还讨论了反射在类加载、内部类、父类成员访问等方面的特殊行为,并提供了通过反射跳过泛型检查的示例。最后,简要介绍了字面量和符号引用的概念。全文旨在帮助读者深入理解反射机制及其应用场景。
37 0
[Java]反射
|
3月前
|
安全 Java 索引
Java——反射&枚举
本文介绍了Java反射机制及其应用,包括获取Class对象、构造方法、成员变量和成员方法。反射允许在运行时动态操作类和对象,例如创建对象、调用方法和访问字段。文章详细解释了不同方法的使用方式及其注意事项,并展示了如何通过反射获取类的各种信息。此外,还介绍了枚举类型的特点和使用方法,包括枚举的构造方法及其在反射中的特殊处理。
75 9
Java——反射&枚举
|
2月前
|
安全 Java 测试技术
🌟Java零基础-反射:从入门到精通
【10月更文挑战第4天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
30 2
|
3月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
2月前
|
IDE Java 编译器
java的反射与注解
java的反射与注解
21 0
|
3月前
|
Java 程序员 编译器
Java的反射技术reflect
Java的反射技术允许程序在运行时动态加载和操作类,基于字节码文件构建中间语言代码,进而生成机器码在JVM上执行,实现了“一次编译,到处运行”。此技术虽需更多运行时间,但广泛应用于Spring框架的持续集成、动态配置及三大特性(IOC、DI、AOP)中,支持企业级应用的迭代升级和灵活配置管理,适用于集群部署与数据同步场景。
|
3月前
|
存储 安全 Java
扫盲java基础-反射(一)
扫盲java基础-反射(一)
|
3月前
|
Java
扫盲java基础-反射(二)
扫盲java基础-反射(二)