답변:
명명 된 패키지의 기본 패키지에있는 클래스를 사용할 수 없습니다 .
( 기술적으로 리플렉션 API를 통한 Sharique Abdullah의 답변에 표시된 것처럼 할 수 있지만 이름이 지정되지 않은 네임 스페이스의 클래스 는 가져 오기 선언의 범위 에 포함 되지 않습니다. )
J2SE 1.4 이전에는 다음과 같은 구문을 사용하여 기본 패키지에서 클래스를 가져올 수있었습니다.
import Unfinished;
즉있어 더 이상 허용되지 않습니다 . 따라서 패키지 클래스 내에서 기본 패키지 클래스에 액세스하려면 기본 패키지 클래스를 자체 패키지로 이동해야합니다.
groovy에서 생성 한 소스에 액세스 할 수있는 경우 파일을 전용 패키지로 이동하고 시작 부분에이 "패키지"지시문을 추가하기 위해 약간의 후 처리가 필요합니다.
2014 업데이트 : JDK7 및 JDK8에 대한 버그 6975015 는 이름없는 패키지에서 가져 오기를 더욱 엄격하게 금지합니다.
은
TypeName
클래스 유형, 인터페이스 유형, 열거 유형 또는 주석 유형의 정식 이름이어야합니다.
형식은 회원이어야 라는 패키지 또는 최 어휘 유형을 둘러싸의 부재 인 타입의 부재 라는 패키지 , 또는 오류가 발생하는 컴파일 시간 .
"처음에 [기본 패키지]가있는 이유는 무엇입니까? 디자인 오류?"
아니, 의도적입니다.
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");
val bar = "hi"; val fooClass = Class.forName("FooClass"); val fooMethod = fooClass.getMethod("foo", classOf[Array[String]]); val fooReturned = fooMethod.invoke(fooClass.newInstance(), Array(bar));
Class.forName("FooBar").newInstance().fooMethod("I did it")
Groovy
코드 에서 패키지를 사용할 수 있으며 모든 것이 잘 작동합니다.
그것은 코드의 사소한 재구성 grails-app
과 처음에는 약간의 고통을 의미 할 수 있지만, 대규모 성배 프로젝트에서는 패키지로 구성하는 것이 합리적입니다. 우리는 자바 표준 패키지 명명 규칙을 사용합니다 com.foo.<app>.<package>
.
기본 패키지에있는 모든 것이 통합에 방해가됩니다.
컨트롤러는 Java 패키지에 포함되지 않는 하나의 Grails 아티팩트 (또는 아티팩트) 인 것 같습니다. 아마 나는 Convention
아직 그것을 이해하지 못했을 것입니다. ;-)