Как ссылаться на метод или свойство в Java? - PullRequest
0 голосов
/ 02 апреля 2020

Я довольно новичок в Java. Я хотел бы знать, можно ли ссылаться на метод или свойство в Java. Это не спецификация c для Hibernate ORM, но просто для того, чтобы дать вам представление, следующий пример записан как классы сущностей Hibernate.

@Entity(name = "Person")
public static class Person {

    @Id
    private Long id;

    private String name;

    @OneToMany(mappedBy = "author")
    private List<Book> books = new ArrayList<>();
}

@Entity(name = "Book")
public static class Book {

    @Id
    private Long id;

    private String title;

    @NaturalId
    private String isbn;

    @ManyToOne
    private Person author;
}

Свойство Person::books имеет аннотацию OneToMany с mappedBy установлен в "author", что в конечном итоге ссылается на свойство Book::author во время компиляции. Я считаю, что это возможно благодаря мощным функциям обратного инжиниринга Java, также известным как Reflection. Это здорово, но чтобы сделать вещи еще проще и отлаживаемыми, вместо того, чтобы ставить значение String в качестве значения mappedBy, я бы хотел использовать ссылку put на Book::author. Это гарантирует, что мы не будем ссылаться на недопустимое свойство на лету (дружественно к IDE). Если мы по ошибке изменим строку на "authors", мы не узнаем, что она недействительна, если не скомпилируем код.

Поэтому предпочтительный код для аннотации OneToOne будет выглядеть следующим образом:

@OneToMany(mappedBy = Book::author)
private List<Book> books = new ArrayList<>();

Я полагаю, что ссылка на метод существует в Objective- C. (и JavaScript тоже хакерским способом).

Как я уже сказал, вопрос в том, есть ли у Java функция ссылки на метод / свойство или какие-либо хаки для этого? Это не указано c для Hibernate ORM. Я говорю о языковой особенности в целом.

1 Ответ

0 голосов
/ 02 апреля 2020

Это невозможно, поскольку аннотации допускают только определенные типы, такие как примитивы, перечисления, классы, другие аннотации, и так далее . Они не учитывают интерфейсы, не говоря уже о ссылках на функции / методы.

...