Есть ли способ сгенерировать код в интерфейсе при реализации его в классе - PullRequest
0 голосов
/ 01 июня 2018

Я хочу добавить все тезисы getter и setter класса в интерфейс, который я реализую в этом конкретном интерфейсе.Я также хочу создать окончательную переменную, которая похожа на переменную класса.Эта переменная может использоваться в качестве строки для доступа к переменной класса после десериализации.

Например:

public class Abc implements IAbc{

private String oneVariable;

 public String getOneVariable(){
    return oneVariable;
 }
}

При реализации вышеуказанного класса с интерфейсом IAbc.IAbc должен содержать следующий код:

public interface IAbc{
  public static final String ONE_VARIABLE = "oneVariable";

  public getOneVariable();

}

Я пробовал поискать в Google решение, но не смог его получить.Также методы в классе должны иметь аннотацию @Override после генерации этого кода.

1 Ответ

0 голосов
/ 01 июня 2018

TL; DR Это интересная задача программирования, но я нахожу ее очень мало в реальных сценариях.
Здесь имя первой строковой переменной известно заранее, вы можетенапрямую сохраните в нем окончательное значение вместо округлого способа хранения имени второй переменной.


Если вы правильно понимаете, вы пытаетесь получить доступ к (String) переменной класса, имя которого будетбыть в другой строковой переменной.Это возможно с помощью Java-отражения.

Кроме того, вы хотите, чтобы этот код был помещен в интерфейс таким образом, чтобы его можно было (повторно) использовать во всех реализующих его классах.

import java.lang.reflect.Field;

interface Foo {

    public default String getStringVar() 
            throws NoSuchFieldException, IllegalAccessException {
        // get varName
        Class thisCls = this.getClass();
        Field varNameField = thisCls.getField("varName");
        String varName = (String) varNameField.get(this);

        // get String variable of name `varName`
        Field strField = thisCls.getField(varName);
        String value = (String) strField.get(this);

        return value;
    }
}


class FooImpl1 implements Foo {
    public final String varName = "str1";
    public String str1 = "some value";
}

class FooImpl2 implements Foo {
    public final String varName = "str2";
    public String str2 = "some other value";
}

class Main {
    public static void main(String[] args) 
            throws NoSuchFieldException, IllegalAccessException {
        System.out.println(new FooImpl1().getStringVar());
        System.out.println(new FooImpl2().getStringVar());
    }
}

Здесь у меня есть два члена String в классахреализующий интерфейс Foo.Первая varName содержит имя переменной второй String, вторая строковая переменная содержит данные.
В интерфейсе с использованием отражения я сначала извлекаю имя переменной, хранящейся в varName, а затем с помощью этого извлекаю значение secondСтрока.

...