Java 使用反射调用具有泛型parms的方法

Java 使用反射调用具有泛型parms的方法,java,generics,reflection,Java,Generics,Reflection,我正试图将两个已知类型的泛型(acculationfunction,resultBindings)传递到下面的反射调用例程中,但遇到了问题。有人能帮我理解这是如何实现的吗 package com.amir.method.compiler; //hidden imports import java.util.Set; public class CompiledReferencedAttributeMethod implements CompiledMethod { final Cl

我正试图将两个已知类型的泛型(
acculationfunction
resultBindings
)传递到下面的反射调用例程中,但遇到了问题。有人能帮我理解这是如何实现的吗

package com.amir.method.compiler;

//hidden imports

import java.util.Set;

public class CompiledReferencedAttributeMethod implements CompiledMethod {

    final Class<?> generatedClazz;
    //how do i pass the arguments below into the invoke routine??
    final KnownWorkData<AccumulationFunction> accumulationFunction;
    final KnownWorkData<Set<Executable<InstanceSetValue>>> resultBindings;

    public CompiledReferencedAttributeMethod(final int hash,
                                             final KnownWorkData<AccumulationFunction> accumulationFunction,
                                             final KnownWorkData<Set<Executable<InstanceSetValue>>> resultBindings) {
        this.generatedClazz = ReferencedAttributeMethodGenerator.get().compileMethod(
                "com.amir.hotspot.GeneratedGRAMethod" +hash, "dynamicGra", accumulationFunction, resultBindings);
        this.accumulationFunction = accumulationFunction;
        this.resultBindings = resultBindings;
    }

    @Override
    public WorkDataValue invokeCompiled(final Instance onInst,
                                        final ExecutionParms parm,
                                        final WorkDataDefinition returntype,
                                        final TaskContext context) {
        try {
            return (WorkDataValue) this.generatedClazz
                    .getMethod("dynamicGra",
                            Instance.class,
                            ExecutionParms.class,
                            WorkDataDefinition.class,
                            TaskContext.class)
                    .invoke(null, onInst, parm, returntype, this.accumulationFunction, this.resultBindings, context);
        } catch(Exception e) {
            throw new ExecuteCompiledMethodException(this.toString(), e);
        }
    }

}
package com.amir.method.compiler;
//隐藏导入
导入java.util.Set;
公共类CompiledReferencedAttributeMethod实现CompiledMethod{
最后一节课生成clazz;
//如何将下面的参数传递到调用例程??
最终了解工作数据积累功能;
最终已知工作数据结果绑定;
公共编译引用属性方法(最终整数散列,
最终了解工作数据累积功能,
最终已知工作数据(结果绑定){
this.generatedClazz=ReferencedAttributeMethodGenerator.get().compileMethod(
“com.amir.hotspot.GeneratedGRAMethod”+散列、“dynamicGra”、累加函数、结果绑定);
this.累加函数=累加函数;
this.resultBindings=resultBindings;
}
@凌驾
public WorkDataValue invokeCompiled(最终实例onInst,
最终执行,
最终工作数据定义返回类型,
最终任务(上下文){
试一试{
返回(WorkDataValue)this.generatedClazz
.getMethod(“dynamicGra”,
Instance.class,
ExecutionParms.class,
WorkDataDefinition.class,
TaskContext.class)
.invoke(null、onInst、parm、returntype、this.contractionfunction、this.resultBindings、context);
}捕获(例外e){
抛出新的ExecuteCompiledMethodException(this.toString(),e);
}
}
}

因为您不能用泛型和不同的参数重载方法(请参阅:),所以您不必担心反射API的泛型

没有歧义,您可以简单地获得如下方法:

Method m = this.generatedClazz.getMethod("dynamicGra",
                            Instance.class,
                            ExecutionParms.class,
                            WorkDataDefinition.class,
                            KnownWorkData.class,
                            KnownWorkData.class,
                            TaskContext.class);
然后使用null调用,这意味着dynamicGra必须是静态的,如果不是这种情况,则必须传递要调用其方法的generatedClazz实例:

Object instance = this.generatedClazz.newInstance(); // A new one or any other reference of generatedClazz
m.invoke(instance, onInst, parm, returntype, this.accumulationFunction, this.resultBindings, context);

您正在生成一个类并通过反射调用生成的代码?为什么不让生成的类实现一个现有接口,该接口允许您在不进行反射的情况下调用该方法?您应该添加异常跟踪。但奇怪的是:dynamicGra必须是一个静态方法(使用null值调用)。然后你要求一个4参数的方法,然后用6个参数调用它…@nomoa,我特别要问的是,我如何将这两个缺少的参数传递给getMethod@Holger我想我可以在下一次迭代中这样做,当我开始工作时,这是一个好主意。也许我遗漏了什么,但是getMethod应该这样调用:getMethod(“dynamicGra”,Instance.class,ExecutionParms.class,WorkDataDefinition.class,KnownWorkData.class,KnownWorkData.class,TaskContext.class)