Java 反射调用静态方法

一、说明

java反射调用某个类的静态方法根据使用不同的jdk版本有两种方式:

jdk1.6及以前版本

代码:Object invoke = method.invoke(null, Object... args),从底层方法被调用的对象设置为 null 即可。

package pictureeditor.picture.stationsearch;

import java.lang.reflect.Method;

/**
 * @Auther: mazhongjia
 * @Date: 2020/7/22 11:40
 * @Version: 1.0
 */
public class ReflectExample {

    public static String stringStaticMethod(String s) {
        return s + "|" + s;
    }

    public static void main(String[] args) throws Throwable {
        Method method = ReflectExample.class.
                getDeclaredMethod("stringStaticMethod", String.class);

        Object invoke = method.invoke(null, "invoke"); // obj 传 null
        System.out.println(invoke); // invoke|invoke
    }
}

java.lang.reflect.Method 类对应 invoke 方法说明:

在具有指定参数的方法对象上调用此方法对象表示的基础方法。 个别参数自动解包以匹配原始形式参数,原始参考参数和参考参数都需要进行方法调用转换。

  • 如果底层方法是静态的,则指定的 obj 参数将被忽略。 它可能为 null。
  • `如果底层方法所需的形式参数的数量为 0,则提供的 args 数组的长度为 0 或为空。
  • 如果底层方法是一个实例方法,它将使用动态方法查找来调用,如“Java 语言规范”第二版,第 15.12.4.4 节所述; 特别是将会发生基于目标对象的运行时类型的覆盖。
  • 如果底层方法是静态的,则如果尚未初始化该方法,那么声明该方法的类将被初始化。
  • 如果方法正常完成,则返回的值将返回给调用者; 如果值具有原始类型,则首先将其适当地包装在对象中。 但是,如果该值具有基本类型的数组的类型,则该数组的元素不会包含在对象中; 换句话说,返回一个原始类型的数组。 如果底层方法返回类型为 void,则调用返回 null。

二、jdk1.7使用 java.lang.invoke 包的 MethodHandle 调用

JDK 7 为间接调用方法提供了 MethodHandle 类,即方法句柄。可以将其看作是反射的另一种方式。主要是为了虚拟机直接提供的动态语言支持。

public class InvokeExample {

    public static String stringStaticMethod(String s) {
        return s + "|" + s;
    }
    
    public static void main(String[] args) {
        // 获取静态方法类型:返回值与参数均为 String
        MethodType methodType = MethodType.methodType(String.class, String.class);
        
        // 获取静态方法的句柄
        MethodHandle method =  MethodHandles.lookup()
        .findStatic(InvokeExample.class, "stringStaticMethod", methodType);
        
        // 调用方法
        Object r = method.invoke("invoke"); // invoke|invoke
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值