LambdaMetafactory替代反射,提高效率

本文介绍如何使用Java反射和LambdaMetafactory创建一个基于特定接口的动态代理对象,并通过示例展示如何调用目标方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 * 被lambda调用的类和方法
 */
public class Operation {
    public int operate(int a,int b,int c){
        return a+b-c;
    }
}
@FunctionalInterface
/**
 * 自定义的函数式接口,用于lambda调用
 */
public interface Operator {
    /**
     * 入参应和被lambda调用的方法一致,在本例中是Operation中的operate方法
     * @param a
     * @param b
     * @param c
     * @return 返回值应和被lambda调用的方法一致,在本例中是Operation中的operate方法
     */
    int toOperate(int a,int b,int c);
}
import java.lang.invoke.LambdaMetafactory;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.Method;

public class Test {
    public static void main(String[] args) {
        String className="Operation";
        String methodName="operate";
        try {
            //通过全类名,获取类的实例
            Class clazz=Class.forName(className);
            //获取到类的对象,要求该类必须有无参构造
            Operation o = (Operation)clazz.newInstance();
            //获取方法对象
            Method method= clazz.getDeclaredMethod(methodName,int.class,int.class,int.class);
            MethodHandles.Lookup lookup=MethodHandles.lookup();
            //指定方法不以反射运行
            MethodHandle mh=lookup.unreflect(method);
            //获取方法的类型
            MethodType type=mh.type();
            //将方法的实例对象类型加到方法类型工厂里
            MethodType factoryType=MethodType.methodType(Operator.class,type.parameterType(0));
            //移除方法里的实例对象类型
            type=type.dropParameterTypes(0,1);
            //获取代理对象,注意,第二个参数的字符串必须为函数式接口里的方法名
            Operator operator=(Operator) LambdaMetafactory.metafactory(lookup,"toOperate",factoryType,type,mh,type).getTarget().invokeExact(o);
            int operate = operator.toOperate(1, 2, 5);
            System.out.println(operate);
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值