기본 패키지에서 Java 클래스에 액세스하는 방법은 무엇입니까?


98

저는 지금 성배 프로젝트에서 다른 사람들과 함께 일하고 있습니다. Java 클래스를 작성해야합니다. 하지만 그루비로 만든 검색 가능한 개체에 액세스해야합니다. 이 객체는 기본 패키지에 배치되어야하는 것 같습니다.

내 질문은 : 명명 된 패키지의 Java 클래스에서 기본 패키지의이 개체에 액세스하는 방법이 있습니까?

답변:


129

명명 된 패키지의 기본 패키지에있는 클래스를 사용할 수 없습니다 .
( 기술적으로 리플렉션 API를 통한 Sharique Abdullah의 답변에 표시된 것처럼 할 수 있지만 이름이 지정되지 않은 네임 스페이스의 클래스 는 가져 오기 선언의 범위 에 포함 되지 않습니다. )

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

import Unfinished;

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

groovy에서 생성 한 소스에 액세스 할 수있는 경우 파일을 전용 패키지로 이동하고 시작 부분에이 "패키지"지시문을 추가하기 위해 약간의 후 처리가 필요합니다.


2014 업데이트 : JDK7 및 JDK8에 대한 버그 6975015 는 이름없는 패키지에서 가져 오기를 더욱 엄격하게 금지합니다.

TypeName클래스 유형, 인터페이스 유형, 열거 유형 또는 주석 유형의 정식 이름이어야합니다.
형식은 회원이어야 라는 패키지 또는 최 어휘 유형을 둘러싸의 부재 인 타입의 부재 라는 패키지 , 또는 오류가 발생하는 컴파일 시간 .


안드레아스 밖으로 점을 코멘트에 :

"처음에 [기본 패키지]가있는 이유는 무엇입니까? 디자인 오류?"

아니, 의도적입니다.
JLS 7.4.2. 이름없는 패키지 는 "작은 또는 임시 응용 프로그램을 개발할 때 또는 개발을 막 시작할 때 주로 편의를 위해 Java SE 플랫폼에서 이름없는 패키지를 제공합니다."라고 말합니다.


7
이전에 다른 사람들에게 설명했듯이 기본 패키지는 Java 세계에서 2 등급 시민입니다. 그냥 하지마. :-)
Chris Jester-Young

1
Groovy (매우 시간이 제한된 프로젝트에서) 또는 기본 패키지의 코드를 배워야 할 것 같습니다. :-(
Mnementh

11
@ ChrisJester-Young 그렇다면 왜 처음에 거기에 있습니까? 디자인 오류?
Pacerier

더 이상 사용되지 않는 이유는 무엇입니까?
Suzan Cioc

@SuzanCioc 의미 : "J2SE1.4 이후에 기본 패키지에 더 이상 액세스 할 수없는 이유는 무엇입니까?"
VonC

61

실제로 할 수 있습니다.

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

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

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

Scala의 경우 다음 코드가 작동합니다.val bar = "hi"; val fooClass = Class.forName("FooClass"); val fooMethod = fooClass.getMethod("foo", classOf[Array[String]]); val fooReturned = fooMethod.invoke(fooClass.newInstance(), Array(bar));
Jus12

2
좋은 대답, +1. 문제는 끝내을 이었기 때문에, 그러나, 당신은 ... (내 생각 녹화 덕트 등) 오리 입력을 사용할 수 있습니다Class.forName("FooBar").newInstance().fooMethod("I did it")
빌 K

7

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

rule * <target package name>.@1

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


4
jarjar을 사용하는 방법에 대한 데모는 좋은 것입니다
BiGGZ

@BiGGZ : ant, gradle 또는 명령 줄에서 jarjar를 사용하는 방법을 보려면 jarjar github 저장소 의 README.md 파일을 참조하세요.
Lucidiot

3

Groovy코드 에서 패키지를 사용할 수 있으며 모든 것이 잘 작동합니다.

그것은 코드의 사소한 재구성 grails-app과 처음에는 약간의 고통을 의미 할 수 있지만, 대규모 성배 프로젝트에서는 패키지로 구성하는 것이 합리적입니다. 우리는 자바 표준 패키지 명명 규칙을 사용합니다 com.foo.<app>.<package>.

기본 패키지에있는 모든 것이 통합에 방해가됩니다.

컨트롤러는 Java 패키지에 포함되지 않는 하나의 Grails 아티팩트 (또는 아티팩트) 인 것 같습니다. 아마 나는 Convention아직 그것을 이해하지 못했을 것입니다. ;-)


0

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

기본 패키지 내부 에서 명명 된 패키지에있는 개체에 액세스 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.