В языке такой возможности нет. Один из вариантов достижения этого - инкапсулировать действие в тип publi c и аккуратно опубликовать sh его в предполагаемом пакете. Например,
package abc;
import java.util.function.Consumer;
import abc.def.B;
import java.lang.Objects;
public class A {
public static Consumer<A> getPrintAccess(B.AccessToken token) {
Objects.requireNonNull(token);
return A::print;
}
private void print() {
System.out.println("privileged action");
}
}
package abc.def;
import abc.A;
public class B {
public static class AccessToken {
/* non-public */ AccessToken() {}
}
void someMethod(A object) {
A.getPrintAccess(new AccessToken()).accept(object);
}
}
Хотя метод getPrintAccess
является общедоступным, он предоставит доступ только к коду, способному создавать экземпляры abc.def.B.AccessToken
. Поскольку его конструктор является частным для пакета, это может сделать только код в пакете abc.def
. Конечно, код в этом пакете не должен передавать экземпляр AccessToken
ненадежному коду.