3

bytebuddy で抽象クラスのサブクラスを作成しようとしており、独自の関数でコンストラクターをオーバーライドしたいと考えています。defineConstructor で動作させることはできません。

スーパークラス:

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

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

サブクラス:

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);
}
}

私のバイトバディ:

    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();

エラー:

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

1 に答える 1

2

スーパークラスのコンストラクターを模倣するデフォルトのコンストラクター戦略を使用しています。サブクラス メソッドは、スーパー クラスを模倣しない別のコンストラクター戦略を使用して、この重複した定義を回避するためにオーバーロードされます。

また、Byte Buddy を更新する必要があります。これにより、より適切なエラー メッセージが表示されます。

于 2016-06-04T00:02:48.183 に答える