【发布时间】:2015-03-17 15:35:58
【问题描述】:
我有一个特殊的要求,我需要确保只允许一个类中的特定方法调用第二个类的公共(非静态)方法。不能使用继承。
一种选择是使用 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();
}
}
}
现在上述解决方案工作正常,但由于代码审计中的质量控制,我需要提出另一个(或更确切地说)更好的解决方案。有没有更好的方法来实现这一点?
【问题讨论】:
-
这是一个非常奇怪的要求。为什么需要它?
-
正是...通常对于像这样的奇怪要求,您应该考虑更改逻辑以完全避免这种情况。
-
更改公共方法以获取对象引用,并使用
instanceof检查对象引用类型可能不那么脆弱。否则编写一些特殊的单元测试。但@Neilos 的建议更明智。 -
用包含非法方法的新 C 扩展 B 怎么样?
-
嗯...这有点尴尬,但我的情况是架构师不会让我使用继承来解决这个问题,忘记改变逻辑(就在第八个致命的罪.. . ). “改变设计方式”的空间很小另一方面,质量控制有一个自动审核员,它会扫描 StackTrace 的使用情况,作为“潜在的 JVM 内存泄漏”。相信我,当我这么说的时候,自动审核员就像是某个神圣的神灵一样受到尊重。是的,这个要求不仅很奇怪,而且完全无法解释。 @Antoniossss 谢谢