私有和受保护之间的Java

时间:2013-04-12 10:36:49

标签: java access-modifiers

我有一个带有方法的类,我希望它只能用于其子对象,而不能用于此包中的其他类。

Modifier    | Class | Package | Subclass | World
————————————+———————+—————————+——————————+———————
public      |  ✔    |    ✔    |    ✔     |   ✔
————————————+———————+—————————+——————————+———————
protected   |  ✔    |    ✔    |    ✔     |   ✘
————————————+———————+—————————+——————————+———————
no modifier |  ✔    |    ✔    |    ✘     |   ✘
————————————+———————+—————————+——————————+———————
private     |  ✔    |    ✘    |    ✘     |   ✘
____________+_______+_________+__________+_______
my Modifier |  ✔    |    ✘    |    ✔     |   ✘
____________+_______+_________+__________+_______

是否有解决方法来使用这种修饰符?

也许有办法让一个包最终,所以其他程序员不能在我的包中添加任何类?

或者有没有办法获取调用该函数的实例,并检查这个是否是我的super对象的实例?

或者我只需要保留它,只使用受保护的,其他程序员可能会在我的包中添加类...

1 个答案:

答案 0 :(得分:6)

1)您无法在Java中创建自定义访问修饰符

2)你可以将包装密封在罐子里,见http://docs.oracle.com/javase/tutorial/ext/security/sealing.html

3)你可以找到调用类,试试

public static void main(String[] args) throws Exception {
    xxx();
}

static void xxx() {
    Class[] cc = new SecurityManager() {
        @Override
        protected Class[] getClassContext() {
            return super.getClassContext();
        }
    }.getClassContext();
    System.out.println(cc[cc.length - 1].getName());
}