2016-06-02 11 views
1

Ich versuche, eine Unterklasse einer abstrakten Klasse in bytebuddy zu erstellen und den Konstruktor mit meiner eigenen Funktion zu überschreiben. Ich kann nicht mit defineConstructor arbeiten.ByteBuddy Unterklasse Konstruktor

Superklasse:

public abstract class AbstractDMTable { 
protected HashMap<String, DMEntry<?>> parameterMap; 

public DMEntry<?> getParameter(String paramName) { 
    if (parameterMap.containsKey(paramName)) 
     return parameterMap.get(paramName); 
    return null; 
}... 

Unterklasse:

public class DMTable_DEBUGOUT extends AbstractDMTable { 
/** 
* Table entry 
* prints the value of the specified parameter 
*/ 
public DMEntry<DMEntry<?>> DEBUG_PARAM; 

/** 
* Table entry 
* execution interval of the step handler (s) 
*/ 
public DMEntry<Double> EXEC_INTERVAL; 

/** 
* Table entry 
* active/not active status of this subsystem 
*/ 
public DMEntry<Boolean> IS_ACTIVE; 

/** 
* Standard constructor. Creates a new table and initializes all entry fields with all entry values set to {@code null} 
*/ 
public DMTable_DEBUGOUT() { 
    super(); 
    DEBUG_PARAM = new DMEntry<>(); 
    parameterMap.put("DEBUG_PARAM", DEBUG_PARAM); 
    EXEC_INTERVAL = new DMEntry<>(); 
    parameterMap.put("EXEC_INTERVAL", EXEC_INTERVAL); 
    IS_ACTIVE = new DMEntry<>(); 
    parameterMap.put("IS_ACTIVE", IS_ACTIVE); 
} 
} 

Mein ByteBuddy:

DynamicType.Builder<? extends AbstractDMTable> subsystem = new ByteBuddy().subclass(AbstractDMTable.class) 
      .name("DMTable_" + name).defineConstructor(Collections.<Class<AbstractDMTable>> emptyList(), Visibility.PUBLIC); 
    for (Entry<String, Pair<String, String>> p : t.getValue().entrySet()) { 
     subsystem.defineField(p.getKey(), this.createSubSystemEntry(p).getClass(), Visibility.PUBLIC); 
    } 
    // subsystem.defineConstructor(Arrays.<Class<AbstractDMTable>> 
    // asList(int.class), Visibility.PUBLIC); 
    return subsystem.make().load(getClass().getClassLoader(), ClassLoadingStrategy.Default.WRAPPER).getLoaded(); 

Der Fehler:

defineConstructor(ModifierContributor.ForMethod...) in the type 
DynamicType.Builder<AbstractDMTable> is not applicable for the 
arguments (List<Class<?>>, Visibility) DynamicDatabaseGenerator.java 
line 66 Java Problem 

Antwort

1

Sie verwenden die Standardkonstruktorstrategie, die die Superklassenkonstruktoren imitiert. Die Unterklassenmethode wird überladen, um diese doppelte Definition zu vermeiden, indem eine andere Konstruktorstrategie verwendet wird, die die Superklasse nicht nachahmt.

Außerdem sollten Sie Byte Buddy aktualisieren, damit Sie eine bessere Fehlermeldung erhalten.

Verwandte Themen