2013-04-12 1 views
9

У меня есть класс с методом, который должен быть доступен только для его дочерних объектов, а не для других классов этого пакета.Java между частными и защищенными

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

Есть ли обходной путь для модификатора такого типа?

Возможно, есть способ сделать пакет окончательным, чтобы другие программисты не могли добавлять какие-либо классы в мой пакет?

Или есть способ получить экземпляр, который вызвал функцию, и проверить, является ли этот экземпляр моего объекта super?

Или я просто оставить его, и просто использовать защищенные, и другие программисты могут добавлять классы в мой пакет ...

+1

+1 для ASCII краска – mKorbel

+0

@m Korbel определенно, OP, похоже, приложил для этого значительные усилия =) – Juvanis

+0

@mKorbel Я расширил эту таблицу ascii от [this] (http://stackoverflow.com/questions/215497/in-java-whats-the-difference-between -public-default-protected-and-private? rq = 1) thread: – Jetse

ответ

6

1) Вы не можете создать модификатор пользовательских acceess в 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()); 
}