У меня есть своеобразное требование, когда мне нужно убедиться, что только конкретный метод из одного класса разрешен для вызова общедоступного (нестатического) метода из второго класса. Наследование не может быть использовано.Java - Как ограничить вызов метода по определенному методу
Одним из вариантов является использование StackTrace следующим образом:
ClassA.java
package org.rnd.stack;
public class ClassA {
public void methodA() throws IllegalAccessException {
Exception fake = new Exception("FAKE-IGNORE");
StackTraceElement[] stack = fake.getStackTrace();
StackTraceElement st = stack[1];
if ("org.rnd.stack.ClassB".equals(st.getClassName())
&& "methodB".equals(st.getMethodName())) {
System.out.println("You are allowed to call");
} else {
throw new IllegalAccessException("You are not allowed to call");
}
}
}
ClassB.java
package org.rnd.stack;
public class ClassB {
public void methodB() throws IllegalAccessException {
new ClassA().methodA();
}
public void illegalMethod() throws IllegalAccessException {
new ClassA().methodA();
}
public static void main(String[] args) {
try {
new ClassB().methodB();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Теперь выше решение работает хорошо, но из-за для контроля качества при проверке кода мне нужно придумать другое (или, вернее) лучшее решение. Есть ли лучший способ достичь этого?
Это очень странное требование. Зачем тебе это? –
Точно ... обычно для странных требований, подобных этому, вы должны думать об изменении своей логики, чтобы полностью избежать ситуации. – Neilos
Изменение общедоступного метода для ссылки на объект и проверка того, что тип ссылки объекта с использованием 'instanceof' может быть менее хрупким. Else напишите некоторые специальные модульные тесты. Но предложение @Neilos более разумно. – Bathsheba