Нормально ли вызывать private-методы с определенными аннотациями при помощи рефлексии?
Всем привет!
Есть простой класс Test, который определяет private-метод, скажем test.
Данный метод позначается аннотацией @ Annot.
Нормально ли будет (со всех точек зрения):
- получить такой метод при помощи рефлексии
- method.setAccessible(true);
- вызвать
?
Дело в том, что этот класс также объявляет некоторое public-методы, которые могут вызыватся из других мест. При этом, необходимо, чтобы метод с Annot вызвать нельзя было.
Необходимо это для такой ситуации: методы с аннотацией Annot будут вызыватся (ядром приложения) если пришла команда от пользователя, при этом другие объекты не должны иметь права вызвать этот метод(есть костыль при помощи cglib, который проверяет, если имеется аннотация на методе - выбрасывает исключение).
П.с. решение с подпиской на события не предлагать... плиз)
А почему бы не сделать, чтобы класс реализовывал два интерфейса? Ну или даже один - класс со всеми методами и интерфейс с "совсем публичными методами".
interface A{ int getX(); }
class B implements A {
private int x;
int getX(){return x;}
void setX(int v){x = v;}
}
Наружу в явном виде класс B не отдавать, говорить, что это просто "какая-то реализация" интерфейса А. В ядре хранить его именно как объект класса B и вызывать что хочется.
Дело в том, что методы этого класса передаются на клиент(браузер) и он их может вызывать (не суть, просто метод обозначенный аннотацией - может вызыватся клиентом).. Также есть абстрактные методы(с той же аннотацией), которые сервер может вызывать на клиенте.
Методы разные, названия, сигнатуры - все разное
Например: клиент вызывает метод для входа -
не сильно бы хотелось пилить интерфейс под каждый такой метод (ну или на все такие методы - тоже бы не хотелось)
А так вроде как абстрактный класс и абстрактный метод, а cglib его реализует такой метод динамически...
Хотя ваша идея с хранением интерфейса для совсем публичных методов мне нравится
@Model
abstract class LoginModel {
// клиент может вызвать этот метод удаленно
@ClientInvoke
public void login(...) {
this.loginFailed(...);//передаст ответ клиенту
}
//а этот метод Сервер вызывает на клиенте
private abstract void loginFailed(...);
}