2014-10-28 112 views
0

我試圖將兩種已知類型的泛型(accumulationFunction,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); 
     } 
    } 

} 
+2

你生成一個類,並調用屬:您要調用的方法傳遞generatedClazz實例特德代碼然後通過反射?爲什麼不讓生成的類實現一個現有的接口,允許您在沒有Reflection的情況下調用該方法? – Holger 2014-10-28 16:39:35

+1

您應該添加異常追蹤。但奇怪的是:dynamicGra必須是一個靜態方法(用null值調用)。然後你問一個4個ARGS方法,你用6名ARGS ... – nomoa 2014-10-28 16:40:12

+0

@nomoa,就是我要問具體是,我如何通過這兩個缺少的參數getMethod – 2014-10-28 16:45:37

回答

2

正如你不能重載方法與仿製藥和不同的參數(參見:Oracle’s tutorial 「Restrictions on Generics」),你不必理會與反射API仿製藥。

沒有歧義,你可以簡單地得到您的方式類似:

Method m = this.generatedClazz.getMethod("dynamicGra", 
          Instance.class, 
          ExecutionParms.class, 
          WorkDataDefinition.class, 
          KnownWorkData.class, 
          KnownWorkData.class, 
          TaskContext.class); 

然後你用空調用所以它意味着dynamicGra 必須是靜態,如果不是,你必須將案件

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); 
相關問題