私は現在、grails プロジェクトで他のユーザーと協力しています。私はいくつかのJavaクラスを書かなければなりません。しかし、groovy で作成された検索可能なオブジェクトにアクセスする必要があります。このオブジェクトはデフォルト パッケージに配置する必要があるようです。
私の質問は次のとおりです。名前付きパッケージのJavaクラスからデフォルトパッケージのこのオブジェクトにアクセスする方法はありますか?
私は現在、grails プロジェクトで他のユーザーと協力しています。私はいくつかのJavaクラスを書かなければなりません。しかし、groovy で作成された検索可能なオブジェクトにアクセスする必要があります。このオブジェクトはデフォルト パッケージに配置する必要があるようです。
私の質問は次のとおりです。名前付きパッケージのJavaクラスからデフォルトパッケージのこのオブジェクトにアクセスする方法はありますか?
名前付きパッケージからデフォルト パッケージのクラスを使用することはできません。
(技術的には、Sharique Abdullah のリフレクション APIによる回答に示されているようにできますが、名前のない名前空間のクラスはインポート宣言のスコープ内にありません)
J2SE 1.4 より前では、次のような構文を使用してデフォルト パッケージからクラスをインポートできました。
import Unfinished;
それはもう許可されていません。したがって、パッケージ化されたクラス内から既定のパッケージ クラスにアクセスするには、既定のパッケージ クラスを独自のパッケージに移動する必要があります。
groovy によって生成されたソースにアクセスできる場合は、ファイルを専用パッケージに移動し、この「package」ディレクティブを先頭に追加するために、後処理が必要です。
2014 年の更新: JDK7 および JDK8 のバグ 6975015は、名前のないパッケージからのインポートに対するさらに厳しい禁止を説明しています。
は
TypeName
、クラス型、インターフェイス型、列挙型、または注釈型の正規名である必要があります。
型は、名前付きパッケージのメンバーであるか、最も外側の字句的に囲んでいる型が名前付きパッケージのメンバーである型のメンバーである必要があります。そうしないと、コンパイル時エラーが発生します。
アンドレアスはコメントで次のように指摘しています。
「そもそもなぜ[デフォルトのパッケージ]があるの?設計ミス?」
いいえ、わざとです。
JLS 7.4.2。名前のないパッケージは次のように述べています。
実際、できます。
リフレクション API を使用すると、これまでの任意のクラスにアクセスできます。少なくとも私はできました:)
Class fooClass = Class.forName("FooBar");
Method fooMethod = fooClass.getMethod("fooMethod", String.class);
String fooReturned = (String)fooMethod.invoke(fooClass.newInstance(), "I did it");
コードでパッケージを使用でき、Groovy
問題なく動作します。
これはコードの小さな再編成を意味し、grails-app
最初は少し苦労するかもしれませんが、大規模な grails プロジェクトでは、物事をパッケージにまとめることは理にかなっています。Java 標準のパッケージ命名規則を使用しますcom.foo.<app>.<package>
。
あなたが見つけているように、すべてをデフォルトのパッケージに入れることは統合の妨げになります。
コントローラーは、Java パッケージに入れられない唯一の Grails アーティファクト (またはアーティファクト) のようです。おそらく、私はConvention
まだそれを理解していないだけです。;-)