source

디폴트 패키지 내의 Java-classes에 액세스하려면 어떻게 해야 합니까?

goodcode 2022. 9. 3. 13:16
반응형

디폴트 패키지 내의 Java-classes에 액세스하려면 어떻게 해야 합니까?

저는 지금 다른 사람들과 함께 성배 프로젝트에서 일하고 있습니다.자바클래스를 써야 해요.하지만 난 그루비로 만들어진 검색 가능한 물체에 접근해야 해이 오브젝트는 디폴트패키지에 배치해야 할 것 같습니다.

질문입니다. 이름 있는 패키지의 Java 클래스에서 기본 패키지로 이 오브젝트에 액세스할 수 있는 방법이 있습니까?

명명된 패키지에서 기본 패키지의 클래스를 사용할 수 없습니다.
(기술적으로는 Sharique Abdulla의 답변에 나타난 바와 같이 반영 API를 통해 할 수 있지만 이름 없는 이름 공간의 클래스는 Import 신고서포함되지 않습니다.)

J2SE 1.4 이전에는 다음과 같은 구문을 사용하여 기본 패키지에서 클래스를 가져올 수 있었습니다.

import Unfinished;

그건이상 허용되지 않습니다.따라서 패키지 클래스 내에서 기본 패키지 클래스에 액세스하려면 기본 패키지 클래스를 자체 패키지로 이동해야 합니다.

groovy에 의해 생성된 소스에 액세스할 수 있는 경우 파일을 전용 패키지로 이동하고 이 "패키지" 명령을 처음 추가하기 위해 몇 가지 후처리가 필요합니다.


업데이트 2014: JDK7 및 JDK8용 버그 6975015에서는 이름 없는 패키지로부터의 Import를 더욱 엄격하게 금지하고 있습니다.

TypeName클래스 유형, 인터페이스 유형, 열거 유형 또는 주석 유형의 표준 이름이어야 합니다.
이 유형은 명명된 패키지의 멤버이거나 가장 바깥쪽을 어휘로 둘러싸는 유형이 명명된 패키지의 멤버여야 합니다.그렇지 않으면 컴파일 시 오류가 발생합니다.


Andreas코멘트에서 다음과 같이 지적합니다.

"애초에 [기본 패키지]가 있는 이유는 무엇입니까?설계 오류?"

아니, 고의적인 거야
JLS 7.4.2. 이름 없는 패키지: "이름 없는 패키지는 주로 소규모 또는 임시 응용 프로그램을 개발할 때 또는 개발을 시작할 때 편의를 위해 Java SE 플랫폼에 의해 제공됩니다."

사실, 할 수 있어요.

Reflections API를 사용하여 지금까지 모든 클래스에 액세스할 수 있습니다.적어도 나는 할 수 있었다:)

Class fooClass = Class.forName("FooBar");
Method fooMethod = fooClass.getMethod("fooMethod", String.class);

String fooReturned = (String)fooMethod.invoke(fooClass.newInstance(), "I did it");

jarjar를 사용하여 다음 규칙으로 jar 파일을 다시 패키징합니다.

rule * <target package name>.@1

소스 jar 파일의 기본 패키지에 있는 모든 클래스가 대상 패키지로 이동하므로 액세스할 수 있습니다.

하실 수 .Groovy그럼 잘 될 거야

은, 「」이라고 하는 이 있습니다.grails-app처음에는 조금 번거롭지만, 큰 그릴 프로젝트에서는 패키지로 정리하는 것이 매우 편리합니다. 표준 규칙 Java를 합니다.com.foo.<app>.<package>.

기본 패키지에 모든 것이 포함되어 있으면 통합에 방해가 됩니다.

자바 그라일스(artefact) 나는 아직 그 하지 못했을 것이다.Convention는. ;-)

아이디어를 완성하기 위해:

default-package 내부에서는 이름 있는 패키지에 있는 개체에 액세스할 수 있습니다.

언급URL : https://stackoverflow.com/questions/283816/how-to-access-java-classes-in-the-default-package

반응형