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();
        }
    }
}

现在上述解决方案工作正常,但由于代码审计中的质量控制,我需要提出另一个(或更确切地说)更好的解决方案.有没有更好的方法来实现这一目标?

解决方法:

改进方法的一种方法是,您不需要创建异常来获取堆栈跟踪,您可以使用线程方法.

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");
}

除此之外,我不知道如何在不改变逻辑或继承的情况下更好地做到这一点.

上一篇:如果不是来自某些引用PHP,则限制访问


下一篇:MySQL外键约束On Delete和On Update的使用