Как указывало в Turing85, oneClass
должно быть в его собственном файле, иначе это будет package-private
, что означает, что вы можете получить к нему доступ только из классов одного и того же пакета.
Есть ли другой способ?Есть, но это не будет простой вызов конструктора.Используя рефлексию, вы можете обойти защиту класса, поля и вызова метода.
public class InnerClassTest {
public static void main(String[] args) throws Exception {
Constructor<OneClass> constructor = OneClass.class.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
OneClass instance = constructor.newInstance("John");
InnerClass innerClass = new InnerClass(1, instance);
}
}
Это значит, что он находит конструктор, который является приватным для Main, потому что класс является приватным для пакета.Затем он отключает его защиту, обратите внимание, что они временные, объект Constructor является новой ссылкой и разрешает вызов только по этой ссылке.
Но Я не рекомендую делать это широко.У Reflection есть несколько вариантов использования, главным образом для помощи программистам в таких средах, как Spring, но в противном случае он может нарушать объектно-ориентированные шаблоны.