我有一个特殊的要求,我需要确保只允许一个类中的特定方法从第二个类调用公共(非静态)方法.不能使用继承.
一种选择是使用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();
}
}
}
现在上述解决方案工作正常,但由于代码审计中的质量控制,我需要提出另一个(或更确切地说)更好的解决方案.有没有更好的方法来实现这一目标?
解决方法:
改进方法的一种方法是,您不需要创建异常来获取堆栈跟踪,您可以使用线程方法.
StackTraceElement[] stack = Thread.currentThread().getStackTrace();
也许你想使用该类而不是手写包.例如:
if (ClassB.class.getName().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");
}
除此之外,我不知道如何在不改变逻辑或继承的情况下更好地做到这一点.