2014-10-28 2 views
0

Я пытаюсь передать два генерика с известными типами (accumulationFunction, resultBindings) в подзаголовок invoke invoke ниже, но у меня проблемы. Может ли кто-нибудь помочь мне понять, как это можно достичь?Вызов метода с помощью общих парм с использованием отражения

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

вы генерацию класса и вызов родов затем через Reflection? Почему бы вам не дать сгенерированному классу реализовать существующий интерфейс, который позволяет вам вызывать метод без Reflection? – Holger

+1

Вы должны добавить трассировку исключения. Но что-то странное: dynamicGra должен быть статическим методом (вы вызываете нулевое значение). Затем вы попросили метод с 4 аргументами, и вы вызываете его с помощью 6 аргументов ... – nomoa

+0

@nomoa. Я спрашиваю конкретно, как передать эти два отсутствующих параметра в getMethod –

ответ

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 должен быть статическим, если это не так, вы должны передать экземпляр 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); 
Смежные вопросы