从公共静态上下文访问私有静态方法

4
考虑以下示例类:
class TargetClass {
    private static String SENSITIVE_DATA = "sw0rdfish";

    private static String getSensitiveData() {
        return SENSITIVE_DATA;
    }
}

当我执行这个操作时,
import java.lang.reflect.Method;

public class ClassPiercing {

    public static void main(String... args) throws Exception {
        Class targetClass = Class.forName("TargetClass");
        Method[] methods = targetClass.getDeclaredMethods();
        methods[0].setAccessible(true);
        String sensitiveData = (String)methods[0].invoke(null, null);
        System.out.println("Sensitive Data: " + sensitiveData);
    }
}

输出结果为,
Sensitive Data: sw0rdfish

这很危险。我该如何防止这种情况发生?


1
不使用反射? - Tom Hawtin - tackline
当然,如果程序员们普遍都这样想的话。 - setzamora
2个回答

8

解决了问题,但您仍然可以反汇编该类(或者只需使用文本编辑器查看其中的内容)。 - user85421
1
是的,从任何角度来看,在静态final字段中存储密码都是愚蠢的。 - alamar
这只是一个例子,你知道真正的含义是什么。 - setzamora

4

访问控制的目的不是防止某人黑进您的代码;而是向其他程序员传达意图(例如api设计)。如果您不信任其他程序,应使用不同的措施。例如,您可以以某种方式加密数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接