この章では、JDeveloperで提供されるツールや機能を使用して、Javaアプリケーションを作成する方法について説明します。ダイアグラムでクラスを定義する方法を説明します。クラスのメンバー、継承およびコンポジット関係はすべて、それらのクラスのJavaソース・コードから直接導出されます。
この章では、次の項目について説明します。
JDeveloperでは、JavaBeansを使用してJavaアプレットおよびクライアント・アプリケーションをビルドおよびアセンブルでき、SwingおよびAWTコンポーネントを使用して対話型のデスクトップベースのGUIアプリケーションをビルドおよびアセンブルできます。JDeveloper IDEでJava Web Startを備えたJavaクライアント・アプリケーションを作成および実行することもできます。
JDeveloperには、Javaドメインで次のタスクを実行するためのリソースが用意されています。
Javaクラスのモデル化 - Javaクラスおよびインタフェースを視覚的に作成するための、または既存のJavaクラスおよびインタフェースをグラフィカルに表示するためのツール。
Javaソース・ファイルの編集 - ソース・エディタでは、いくつかのJava対応編集機能がサポートされています。
Javaプロジェクトのリファクタ - プログラムの動作を変更しないでコード構造を変更する一連の自動リファクタ操作。
Apache Antの構築 - 「メイク」コマンドおよび「再ビルド」コマンド、またはApache Antを使用して、プロジェクトをコンパイルします。
Javaプログラムの実行: 実行、デバッグまたはプロファイリングされるプロセスを追跡します。
Javaプログラムのデバッグ - ローカル・デバッグおよびリモート・デバッグ用のツール。
アプリケーションのパフォーマンスの最適化 - Javaコードの品質およびパフォーマンスを分析するためのツール。
JUnitによるユニット・テスト: オープン・ソースのJUnitフレームワークを使用して、Javaコードを検証するテストを記述および実行するためのツール。
JDeveloperでは、プロジェクトのクラスとインタフェースおよびそのメンバーのソース・コードを検索し、その場所に移動するためのJava対応機能がサポートされています。
JDeveloperでの作業中、UIまたはJavaソース・エディタで開いているファイルから、Java要素を直接参照できます。
Java要素をUIから直接参照するには、次のようにします。
メイン・メニューから「ナビゲート」→「Javaタイプに移動」を選択します。または、キーボード・ショートカットの[Ctrl]+[-]も使用できます。
「Javaタイプに移動」ダイアログで、検索するJavaタイプの名前を入力します。このフィールドでテキストの入力を開始すると、テキストに一致するJavaエンティティのリストが表示されます。
リストでエンティティをダブルクリックすると、エンティティがソース・エディタに開きます。
エディタで現在開いているファイルのクラスまたはインタフェースを参照するには、次のようにします。
エディタでファイルを開いた状態で、エディタにフォーカスがあることを確認します。
ソース・ファイルでクラス名またはインタフェース名を選択し、右クリックして「宣言に移動」を選択します。
Javaソース・エディタにソース・ファイルが開きます。
Javaソース・エディタでの作業中、任意の識別子の宣言を簡単に検索できます。
コード要素の宣言に移動するには、次のようにします。
コード要素を右クリックし、「宣言に移動」を選択します。または、
[Ctrl]を押しながら、コード要素を左クリックします。
選択した要素のソース・コードが開き、宣言文がハイライト表示されます。
Javaソース・エディタでの作業中、クラスやインタフェースへの参照およびそのメンバーを簡単に検索できます。デフォルトでは、現在のプロジェクトおよび依存プロジェクトの使用方法が報告されます。ライブラリのソース・ファイルにアクセス可能な場合は、検索対象をライブラリにまで拡大できます。
「使用方法の検索」コマンドは、個々のメソッドとフィールド、およびローカル変数とパラメータにも適用できます。
クラスの使用方法を検索するには、次のようにします。
次のいずれかの方法で、クラスまたはインタフェースを選択します。
Javaソース・エディタで、名前を選択します。
ナビゲータまたは構造ウィンドウで、クラスまたはインタフェースを選択します。
次のいずれかの方法で、コマンドを起動します。
「検索」→「使用方法の検索」を選択します。
右クリックして「使用方法の検索」を選択します。
[Ctrl]キーと[Alt]キーを押しながら[U]キーを押します。
「<オブジェクト>の使用方法」ダイアログが開きます。
「検索」ボックスで、検索で返される参照のタイプを選択します。
「条件」ボックスで、検索対象とするオプションの追加領域を定義します。
検索の出力を設定します。「新規タブ」を選択して、新規使用方法ログに出力します。選択しないと、使用方法に対する直前の検索の結果が存在する場合は破棄されます。
「OK」をクリックします。
検索が開始され、結果が使用方法ログ・ウィンドウに表示されます。
このダイアログを使用すると、Javaソース・エディタで作業するとき、メソッドへの参照を迅速に検索できます。
検索によって、メソッドが定義されているクラスまたはインタフェースのインスタンスへのメソッドのアプリケーション、およびメソッドを継承するサブクラスやサブインタフェースが存在する場合はそのインスタンスのメソッドのアプリケーションが示されます。
また、「使用方法の検索」コマンドをクラスとインタフェース、フィールドおよびローカル変数とパラメータに適用できます。
メソッドの使用方法を検索するには、次のようにします。
次のいずれかの方法で、メソッドを選択します。
Javaソース・エディタで、名前を選択します。
「構造」ペインでフィールドを選択します。
次のいずれかの方法でコマンドを起動します。
「検索」→「使用方法の検索」を選択します。
右クリックして「使用方法の検索」を選択します。
[Ctrl]キーと[Alt]キーを押しながら[U]キーを押します。
「<メソッド>の使用方法」ダイアログが表示されます。このダイアログには、使用方法を検索するために指定できる様々なオプションがあります。
ダイアログでオプションを指定し、「OK」をクリックして検索を開始します。
Javaソース・エディタでの作業中、フィールドへの参照を簡単に検索できます。
検索によって、フィールドが定義されているクラスまたはインタフェースのインスタンス内のフィールドの参照、およびフィールドを継承するサブクラスやサブインタフェースが存在する場合は、そのインスタンスのフィールドの参照が示されます。
「使用方法の検索」コマンドは、クラス、インタフェース、メソッド、ローカル変数およびパラメータにも適用できます。
フィールドの使用方法を検索するには、次のようにします。
次のいずれかの方法で、フィールドを選択します。
Javaソース・エディタで、名前を選択します。
「構造」ペインでフィールドを選択します。
次のいずれかの方法でコマンドを起動します。
「検索」→「使用方法の検索」を選択します。
右クリックして「使用方法の検索」を選択します。
[Ctrl]キーと[Alt]キーを押しながら[U]キーを押します。
「<オブジェクト>の使用方法」ダイアログに入力し、「OK」をクリックします。検索を他の領域に拡張するオプションの指定、検索範囲の定義およびオプションで結果をログ・ウィンドウの新しいタブに表示する指定を行うことができます。
検索が開始され、結果が「<オブジェクト>の使用方法」の「ログ」ウィンドウに表示されます。
Javaソース・エディタでの作業中、メソッド本体のローカル変数またはパラメータへの参照を簡単に検索できます。
「使用方法の検索」コマンドは、クラス、インタフェース、メソッドおよびフィールドにも適用できます。
ローカル変数またはパラメータの使用方法を検索するには、次のようにします。
Javaソース・エディタで変数名またはパラメータ名を選択します。
次のいずれかの方法でコマンドを起動します。
「検索」→「使用方法の検索」を選択します。
右クリックして「使用方法の検索」を選択します。
[Ctrl]キーと[Alt]キーを押しながら[U]キーを押します。
検索が開始され、結果が使用方法ログ・ウィンドウに表示されます。
Javaソース・エディタでの作業中、スーパークラスの定義をオーバーライドするメソッドを簡単に特定できます。オーバーライドする定義には、Javaソース・エディタのマージンに「オーバーライド」の上矢印アイコンが付きます。
オーバーライドされたメソッド定義を表示するには、マージンの「オーバーライド」アイコンをクリックします。
オーバーライドに移動した後、前のビューに戻るには、「戻る」ツールバー・ボタンをクリックします。
Javaソース・エディタでの作業中、スーパークラスの定義をオーバーライドするメソッドを簡単に特定できます。オーバーライドする定義には、Javaソース・エディタのマージンに「実装」の下矢印アイコンが付きます。
オーバーライドされたメソッド定義を表示するには、マージンの「実装」アイコンをクリックします。
オーバーライドに移動した後、前のビューに戻るには、「戻る」ツールバー・ボタンをクリックします。
Javaソース・エディタでの作業中、クラスまたはインタフェースのサブタイプおよびスーパータイプの階層をインスペクトできます。階層ウィンドウには、選択したクラスまたはインタフェースの階層が表示されます。
Javaソース・エディタでクラスまたはインタフェースの階層を表示するには、次のようにします。
クラスまたはインタフェースを選択し、右クリックして「タイプ階層」を選択するか、「ナビゲート」→「タイプ階層」を選択します。
階層ウィンドウが開き(まだ開かれていない場合)、サブタイプまたはスーパータイプのツリーが表示されます。
サブタイプおよびスーパータイプの表示と非表示を切り替えるには、「サブタイプ階層」ボタンまたは「スーパータイプ階層」ボタンをクリックします。
Javaビジュアル・エディタで最初に階層を開くには、次のようにします。
ナビゲータでノードを選択します。
右クリックして「編集」をクリックするか、「ビュー」メニューを使用します。
このノードのGUI階層全体がエディタに表示されます。表示の方法は、この階層がメニュー項目またはメニュー以外の項目のどちらで構成されるかによって異なります。
キーボード・アクセラレータを使用すると、Javaソース・エディタで、クラス定義内でメンバー間を移動できます。
現在のJavaソース・ビューの次のメンバー定義または宣言に移動するには、[Alt]+[↓]キーを押すか、または「ナビゲート」→「次のメンバーに移動」を選択します。
現在のJavaソース・ビューの1つ前のメンバー定義または宣言に移動するには、[Alt]+[↑]キーを押すか、または「ナビゲート」、「前のメンバーに移動」の順に選択します。
次の追加のコードのステップ・コマンドも定義されていますが、デフォルトではアクセラレータは割り当てられていません。
次のクラスに移動
次のフィールドに移動
次のメソッドに移動
前のクラスに移動
前のフィールドに移動
前のメソッドに移動
これらのコマンドは、「プリファレンス」ダイアログのショートカット・キー・ページの「ナビゲート」カテゴリにリストされます。アクセラレータは追加または変更できます。
JDeveloperには、生産性の向上に役立つJava対応編集機能が数多く用意されています。グラフィカル・ユーザー・インタフェースを開発する場合は、テキスト編集のかわりにJava Visual Editorを使用できます。ソース・エディタとビジュアル・エディタは同期しているため、片方を変更すると、ただちにもう一方に反映されます。これらのJava編集機能によって、あらゆるテクノロジのコーディングをサポートする汎用ソース編集機能が強化されています。
Javaビジュアル・エディタには、ユーザー・インタフェースのビジュアル・コンポーネントが「編集」モードで表示されます。
Javaビジュアル・エディタが開いている場合、対応する要素が「構造」ウィンドウに階層表示されます。プロパティ・インスペクタが開いている場合、「構造」ウィンドウまたはJavaビジュアル・エディタで要素を選択すると、インスペクタの選択内容も変更されます。
Javaビジュアル・エディタにはGUI階層が表示されます。メニュー項目がある場合と、メニュー以外の項目がある場合では、階層の表示方法が異なります。使用している編集モードが異なるように、表示のモードも異なります。
Javaビジュアル・エディタで最初に階層を開くには、ナビゲータでノードを選択して右クリックし、「編集」をクリックするか、「表示」メニューを使用します。このノードのGUI階層全体がエディタに表示されます。表示の方法は、この階層がメニュー項目またはメニュー以外の項目のどちらで構成されるかによって異なります。
ナビゲータでノードを選択すると、そのGUI構造も「構造」ウィンドウに表示されます。このオブジェクトのメニュー以外のGUI項目はすべて、UIというラベルが付いたノードの下に表示されます。メニュー項目は、Menuというラベルが付いたノードの下に表示されます。GUI以外の項目は、「その他」というノードの下に表示されます。オブジェクトのJavaビジュアル・エディタをナビゲータで開いた後、メニュー以外のGUI要素とメニュー要素の表示を切り替えるには、「構造」ウィンドウで、これらのUIノードまたはMenuノードの下のノードをクリックします。
Javaビジュアル・エディタでの表示はGUI階層に基づいているため、「構造」ウィンドウで(すべてのGUIオブジェクトの)ノードをクリックすると、ルート・ノードおよびその子の視覚的な表現がエディタにロードされます。階層で選択したノードに関係なく、階層全体が開きます。エディタに表示される内容は、完全なGUI階層を反映します。選択した特定の要素は、ウィンドウで選択した特定のノードを反映します。「構造」ウィンドウとJavaビジュアル・エディタの選択内容は同期化されます。
「構造」ウィンドウに孤立したノードがある場合、そのノードおよび子が階層全体を構成し、孤立したノードが階層のルートになります。Java UIの表示はこれを反映します。たとえば、親のないコントロールがあり、そのコントロールのノードを選択した場合、そのコントロールおよび子はコンテナなしでエディタに表示されます。ただし、そのコントロールに変更を加えると、コードが生成されます。
Javaビジュアル・エディタ内の任意の場所を右クリックすると、コマンドのポップアップ・メニューが表示されます。ポップアップ・メニューは、メニュー以外の項目またはメニュー項目のどちらを編集しているかによって異なります。また、ポップアップ・メニュー内で使用できるコマンドは、選択したオブジェクトによって異なります。
変更するJavaファイルをナビゲータで右クリックして「開く」を選択し、「設計」タブをクリックします。
ソース・コードがコード・エディタ内でアクセス可能になります(ナビゲータでファイルを右クリックして「開く」を選択すると、ソース・コードが表示されます)。これにより、UI設計と並行してソース・コードを表示および編集できます。Javaビジュアル・エディタまたはプロパティ・インスペクタで行った変更は即時にソース・コードに反映され、ソース・コードに対する変更はJavaビジュアル・エディタまたはプロパティ・インスペクタに即時に反映されます。
Javaビジュアル・エディタのツールバーを使用すると、容易にコンポーネントを操作し、選択したコンポーネントについて表示されるポップアップ・メニューから選択できるコマンドを複製できます。次のようなコンポーネント操作があります。
制約: コンポーネントのスペース配分、最大化、アンカーの位置、余白および空間を指定できます。
位置合せ: 各コンポーネントを他のコンポーネントに対する相対位置にすばやく配置できます。
Z順序: 重なり合ったコンポーネントの順序を変更できます。
JDeveloperは軽量(JFC)アプリケーションです。そのため、重量(AWT)コントロールをJavaビジュアル・エディタで直接使用すると、予期せぬ動作が発生します。重量コンポーネントは、軽量JDeveloper環境(コード・エディタおよびUMLモデラーなど)を含めて軽量コンポーネントを常に混乱させます。
Javaビジュアル・エディタにはプロキシ・メカニズムが組み込まれており、Javaビジュアル・エディタでインスタンス化する重量コントロールを表す軽量プロキシを登録できます。JDeveloperには、デフォルトですべての標準AWTコントロールの軽量プロキシが組み込まれています。
JDeveloperでは、Javaビジュアル・エディタで使用できるように登録した重量コンポーネントの軽量ビューをサポートしています。
プロキシ・クラスを登録するには、次のようにします。
例18-1のように、Developer\lib\addins.xml
ファイルのoracle.jdevimpl.uieditor.UIEditorAddin
セクションにキー値の定義を追加します。
これらの意味は、次のとおりです。
PREFIXはjdeveloper.concreteProxy
です。
CLASS_NAMEは、プロキシを登録する重量コンポーネントの完全修飾クラス名です。
PROXY_CLASS_NAMEは、登録するプロキシ・クラスの完全修飾クラス名です。
たとえば、oracle.jdevimpl.uieditor.proxy.Component
プロキシ・クラスを使用してjdeveloper.concreteProxy.java.awt.Component
という仮定の重量コンポーネント実装を登録する場合、追加するプロパティは例18-2のようになります。
例18-2 重量コンポーネント
<property> <key>jdeveloper.concreteProxy.java.awt.Component</key> <value>oracle.jdevimpl.uieditor.proxy.Component</value> </property>
Javaビジュアル・エディタのプロキシ・クラスをコンポーネント・パレットに追加できるようにIDEで使用可能にするには、プロキシ・クラスをレイアウト・アシスタントがプロパティ・インスペクタのJDeveloper¥bin¥jdev.conf
ファイル内でIDEClasspathにディレクティブとして追加する必要があります。次に例を示します。
AddJavaLibFile <myUiProxies.jar>
myUiProxies.jar
は、Javaビジュアル・エディタのプロキシ実装のコンパイル済クラス・ファイルが含まれているjarです。
新規クラスを作成する前に、まずアプリケーションおよびプロジェクトを作成しておく必要があります。作成したクラスは、アクティブなプロジェクトに即時に追加されます。
新規クラスを作成し、プロジェクトに追加するには、次のようにします。
「アプリケーション・ナビゲータ」で、クラスを追加するプロジェクトを選択します。
右クリックして「新規」を選択します。
「新規ギャラリ」で、「一般」カテゴリの「Java」を選択します。
「項目」で、「クラス」を選択します。
「Javaクラスの作成」ダイアログで、クラス名、パッケージ名および新しいクラスが拡張するスーパークラスを入力します。必要に応じて属性を選択します。
「OK」をクリックします。
アクティブなプロジェクトに新規クラスが表示されます。
新規インタフェースを作成する前に、まずアプリケーションおよびプロジェクトを作成しておく必要があります。作成したインタフェースは、アクティブなプロジェクトにすぐに追加されます。
新規インタフェースを作成し、プロジェクトに追加するには、次のようにします。
「アプリケーション・ナビゲータ」で、クラスを追加するプロジェクトを選択します。
右クリックして「新規」を選択します。
「新規ギャラリ」で、「一般」カテゴリの「Java」を選択します。
「項目」で、「インタフェース」を選択します。
「Javaインタフェースの作成」ダイアログで、インタフェース名、パッケージ名および新しいクラスが拡張するスーパークラスを入力します。必要に応じて属性を選択します。
「OK」をクリックします。
アクティブなプロジェクトに新規クラスが表示されます。
ソース・エディタでは、フレームワーク・コードを追加し、インタフェースを実装するターゲット・クラスを変更したり、ターゲット・インタフェースを別のインタフェースに簡単に拡張できます。
implements
句またはextends
句がターゲット・クラスまたはターゲット・インタフェースの宣言に追加され、import文がファイルに追加されます。ターゲットがクラスである場合には、実装されるインタフェースの各メソッドについてスタブ定義がクラスまたはインタフェースの本体に追加されます。
インタフェースを実装するには、次のようにします。
Javaソース・ファイルを開きます。
メイン・メニューから「ソース」→「インタフェースの実装」を選択します。
「検索」タブまたは「階層」タブで、インタフェースの実装先となるクラスを検索し、実装するインタフェースの名前を選択します。
オーバーライドされるメソッドからドキュメント・コメントを組み込む場合は、「Javadocのコピー」を選択します。
「OK」をクリックします。
ソース・エディタでは、スーパークラスから継承したメソッドをオーバーライドするためのスタブ定義をクラスに迅速に追加できます。
メソッドをオーバーライドするには、次のようにします。
Javaソース・ファイルを開きます。
メイン・メニューから「ソース」→「メソッドのオーバーライド」を選択します。
「メソッド」リストで、オーバーライドするメソッドを選択します。
リストには、すべてのスーパークラスから継承されるメソッドが表示されます。abstractメソッドは太字で表示されます。
オーバーライドされるメソッドからドキュメント・コメントを組み込む場合は、「Javadocのコピー」を選択します。
「OK」をクリックします。
スタブ・メソッド定義がクラスに追加されます。
スタブ定義を編集します。
JDeveloperでは、事前定義済のコード・テンプレートを使用できます。コード・テンプレートは、一般的によく使用される文のテキストを挿入することで、より迅速かつ効率的にコードを記述するのに役立ちます。たとえば、Iterate over a list (itli
)テンプレートでは、次のコードが挿入されます。
for (int i = 0; i < unknown.size(); i++) { Object object = (Object) unknown.get(i); }
注意: テンプレートに変数が含まれている場合、変数はハイライト表示されています。各変数を編集して、テンプレートを完成できます。[Tab]を押すと、カレットが次のテンプレート変数に移動します。 |
JDeveloperで提供されるテンプレート以外に、独自のコード・テンプレートを定義することもできます。「プリファレンス」ダイアログの「コード・エディタ」→コード・テンプレート・ページを使用します。
定義済のコード・テンプレートを起動するには、次のようにします。
エディタでファイルを開き、テンプレートを挿入する位置にカーソルを置きます。
テンプレートに対応するショートカットを入力し、[Ctrl]を押しながら[Enter]を押します。
テンプレート内に定義されているコードがソース・ファイルに挿入されます。テンプレートに必要なimport文がある場合は、ファイルの先頭に挿入されます。
注意: [Ctrl]+[Enter]は、デフォルトのキーマップで割り当てられているアクセラレータです。別のキーを割り当てることもできます。 |
この項では、事前定義済のコード・テンプレートをリストします。それぞれについて、テンプレートで導入されるショートカットとコードを示します。
Array Iterator
ai for (int $i$ = 0; $i$ < $array$.length; $i$++) { $type$ $var$ = $array$[$i$]; $end$ }
Data Action Event Handler
daev public void on$end$(PageLifecycleContext ctx) { }
for loop
for for ($end$ ; ; ) { }
if statement
if if ($end$) { }
if else statement
ife if ($end$) { } else { }
integer based loop
fori for (int $i$ = 0; $i$ < $lim$; $i$++) { $end$ }
integer based loop
forn int $n$ = $lim$; for (int $i$ = 0; $i$ < $n$; $i$++) { $end$ }
instanceof + cast
iofc if ($var$ instanceof $type$) { $type$ $casted$ = ($type$) $var$; $end$ }
Instantiate a BC4J application module
bc4jclient String amDef = "test.TestModule"; String config = "TestModuleLocal"; ApplicationModule am = Configuration.createRootApplicationModule(amDef,config); ViewObject vo = am.findViewObject("TestView"); $end$// Work with your appmodule and view object here Configuration.releaseRootApplicationModule(am,true);
Iterate over array
itar for (int $i$ = 0; $i$ < $array$.length; $i$++) { $type$ $var$ = $array$[$i$]; $end$ }
Iterate over a collection
itco for(Iterator $iter$ = $col$.iterator();$iter$.hasNext();) { $type$ $var$ = ($type$) $iter$.next(); $end$
}
Iterate over a list
itli for (int $i$ = 0; $i$ < $list$.size(); $i$++) { $type$ $var$ = ($type$) $list$.get($i$); $end$ }
Iterate over map keys
itmk Iterator $iter$ = $map$.keySet().iterator(); while ($iter$.hasNext()) { $type$ $var$ = ($type$) $iter$.next(); $end$ }
Iterate over map values
itmv Iterator $iter$ = $map$.values().iterator(); while ($iter$.hasNext()) { $type$ $var$ = ($type$) $iter$.next(); $end$ }
JDBC Connection
conn public static Connection getConnection() throws SQLException { String username = "$end$scott"; String password = "tiger"; String thinConn = "jdbc:oracle:thin:@localhost:1521:ORCL"; Driver d = new OracleDriver(); Connection conn = DriverManager.getConnection(thinConn,username,password); conn.setAutoCommit(false); return conn; }
List to array
ltoar $type$ $var$ = new $typeelem$[$list$.size()]; $var$ = ($type$) $list$.toArray($var$); $end$
main method
main public static void main(String[] args) { $end$ }
out.println()
outp out.println($end$);
private ArrayList
pral private ArrayList _$end$ = new ArrayList();
private boolean
prb private boolean _$end$;
private HashMap
prhm private HashMap _$end$ = new HashMap();
private int
pri private int _$end$;
private String
prs private String _$end$;
public static final
pusf public static final $end$;
public static final boolean
pusfb public static final boolean $end$;
public static final int
pusfi public static final int $end$;
public static final String
pusfs public static final String $end$;
Reverse array iterator
ritar for (int $i$ = $array$.length; --$i$ >= 0 ;) { $type$ $var$ = $array$[$i$]; $end$ }
Reverse iteration over a list
ritli for (int $i$ = $list$.size(); --$i$ >= 0 ; ) { $type$ $var$ = ($type$) $list$.get($i$); $end$ }
System.err.println
sep System.err.println($end$);
System.out.println
sop System.out.println($end$);
switch statement
sw switch ($end$) { case XXX: { } break; default; { } break; }
try statement
try try { $end$ } catch (Exception ex) { ex.printStackTrace(); } finally { }
Insert a tag
tag <$tag$> $end$ </$tag$>
while statement
wh while ($end$) { }
「選択の拡大」または「選択の縮小」オプションを使用すると、Java構文に基づいて、選択したコード・ブロックを連続して拡大または縮小できます。
選択したコードを拡大するには、次の手順を実行します。
エディタでファイルを開いた状態で、エディタにフォーカスがあることを確認します。
選択を拡大する位置にカーソルを置くか、またはコードの一部を選択します。
メイン・メニューから「ソース」→「選択の拡大」を選択するか、[Ctrl]と[Shift]を押しながら[=]キーを押します。
前に選択した要素または前にカーソルを置いた要素を含む最小論理単位が含まれるように、選択が拡大されます。
このオプションを連続して適用すると、適用するたびに、開始位置に基づいて、Javaの階層で上にある次の論理ステップが含まれるように、選択が拡大されます。このことは、ファイル全体が選択されるまで行われます。たとえば、メソッド名、修飾されたメソッド・コール、割当て、定義などです。
「選択の縮小」オプションを使用すると(または、[Ctrl]および[Shift]を押しながら[-]を押すと)、選択したコードは同様に連続して縮小されます。
Javaソース・エディタでは、コーディング構造を使用して簡単にJavaの文およびブロックを囲むことができます。
コーディング構造でコード・ブロックを囲むには、次のようにします。
エディタでファイルを開いた状態で、文内で右クリックするか、またはコード・ブロックを選択してから、「囲む」を選択します。または、ソース・エディタのツールバーの「囲む」({ }) アイコンをクリックします。
注意: このアイコンは、選択したコードが「コードを囲む」機能を適用できる有効なコード・ブロックである場合にのみ有効です。 |
「コードを囲む」ダイアログで、コーディング構造を選択します。
Javaソース・エディタでの作業中に、必要なimport文を追加できます。ソース・エディタでの入力中に、まだインポートされていないクラスへの参照を導入すると、そのクラスの下に波線が表示されます。インポートが必要であることを示すポップアップが開き、クラスの完全修飾名が表示されます。クラスへの未解決の参照の完全一致を1つのみ検出できた場合は、JDeveloperによってインポートが自動的に追加されます。
クラスへの未解決の参照の完全一致を1つのみ検出できた場合は、JDeveloperによってインポートが自動的に追加されます。Import Assistanceによって一致の可能性が複数検出された場合は、クラス・パスからすべての一致の可能性を表示するポップアップ・リストが表示されます。ユーザーは適切なインポートを選択でき、そのimport文が自動的に追加されます。
Import Assistanceのポップアップは、[Alt]を押しながら[Enter]を押すことで、いつでもトリガーできます。
左余白をベースとするコード・アシスタンスを使用して、import文を追加できます。エディタによってクラスが認識されない場合は、行がハイライト表示されたときに電球が左余白に表示され、様々なインポート・オプションが表示されます。
Import Assistanceを構成するか無効にするには、Javaソース・エディタでimport文オプションを設定できます。
Javaソース・エディタでは、簡単にimport文を編成できます。「設定」ダイアログで、import文を編成するためのオプションを必要に応じて設定します。次のオプションがあります。
パッケージ名およびクラス名でアルファベット順にimport文をソートおよびグループ化します。
パッケージ用のtype-import-on-demand文を個々のクラス用のsingle-type-import文に置き換えて、インポートを縮小します。
ある共通パッケージのクラスの2つ以上のsingle-type-import文をそのパッケージの1つのtype-import-on-demand文に置き換えて、インポートを拡大します。
参照されないクラスに対するimport文を削除します。
インポート編成オプションを設定または無効にできます。詳細は、第17.4.3項「Javaソース・エディタの自動Import Assistanceの有効化方法」を参照してください。
ソース・ファイルでimport文を編成するには、次のようにします。
エディタでファイルを開いた状態で、右クリックして「インポートの編成」を選択します。
JDeveloperの編集コマンドを使用して、ドキュメント・コメントを作成および保守できます。
Javaソース・エディタでは、ソース・ファイルにドキュメント・コメントを追加できます。
ソース・ファイルにドキュメント・コメントを追加するには、次のようにします。
コメントを追加するクラス宣言、フィールドまたはメソッドのすぐ上にカーソルを置き、ドキュメント・コメントの開始(/**
)を入力してから[Enter]を押します。
「構造」ウィンドウでコード要素を選択した状態で右クリックし、「Javadocコメントの追加」を選択します。
ドキュメント・コメント用のテンプレートがファイルに挿入されます。このテンプレートにコード要素の情報を追加してください。
Javaコード・エディタでは、ドキュメント・コメント・タグの使用をカスタマイズできます。カスタム・タグを定義したり、ドキュメント・コメントの作成時にどのタグを自動的に含めるかを選択できます。ここで選択した内容は、すべてのプロジェクトに適用されます。
カスタム・タグを定義するには、次のようにします。
メイン・メニューから、「ツール」→「プリファレンス」を選択します。
「プリファレンス」ダイアログで、「コード・エディタ」→「Java」→「Javadoc」ページを選択します。
「追加」をクリックします。デフォルト名new
のタグがリストに追加されます。
「タグのプロパティ」ボックスで、タグの名前を変更し、その他のプロパティを設定します。
終わったら、「OK」をクリックします。
Javaソース・エディタでは、ドキュメント・コメントを更新できます。
ソース・ファイルのドキュメント・コメントを更新するには、次のようにします。
構造ウィンドウで、コメントを更新する要素の上にカーソルを置きます。
右クリックして、「Javadocコメントの追加」を選択します。
ドキュメント・コメントに対するタグが追加または削除されて、要素に加えた変更が反映されます。新しいタグに関する説明を追加します。
ソース・ファイルに記載されているドキュメント・コメントを検証できます。監査を実施すると、書式設定エラー、欠落しているタグまたは余分なタグが報告されます。
ソース・ファイルのドキュメント・コメントをチェックするには、次のようにします。
アプリケーション・ナビゲータで、チェックするファイルを選択します。
メイン・メニューから「ビルド」→「コード監査 <ファイル名>」を選択します。
「コード監査」ダイアログで、「プロファイル」ドロップダウン・リストから「Javadocルール」を選択します。
検索または無視するエラーのタイプを選択できるようにコード監査を設定する場合には、「編集」をクリックします。
「監査プロファイル」ダイアログが開きます。
「実行」をクリックします。
コード監査の結果は、ログ・ウィンドウに表示されます。
新しいJavadocタグを追加して、既存のタグの属性をカスタマイズできます。カスタム・タグを作成する場合、タグをコード要素に関連付けて、必須かどうかを定義し、デフォルト値を割り当てて、タグ・リストでの順序を指定できます。
Javaソース・エディタのJavadocのオプションをカスタマイズするには、次のようにします。
メイン・メニューから、「ツール」→「プリファレンス」を選択します。
「設定」ダイアログで、「コード・エディタ」ノードを開きます。
「Java」ノードを開いて、「Javadoc」を選択します。
「Javadoc」ページで、「タグ」リストの項目を選択すると、項目の属性が右側に表示されます。太字で表示されるタグは、カスタマイズ可能です。
タグを追加するには、「追加」をクリックして、情報を入力します。
「タグ」リスト内でのタグの位置を変更するには、タグを選択して、上矢印ボタンまたは下矢印ボタンをクリックします。
マウスを使用せずにこの操作を実行するには、[Tab]キーでボタンに移動し、[Space]キーを押します。
タグを削除するには、「タグ」リストからタグを選択して、「削除」をクリックします。
終わったら、「OK」をクリックします。
Javaソース・エディタでは、ソース・ファイルにドキュメント・コメントを追加できます。
ソース・ファイルにドキュメント・コメントを追加するには、次のようにします。
コメントを追加するクラス宣言、フィールドまたはメソッドのすぐ上にカーソルを置き、ドキュメント・コメントの開始(/**
)を入力してから[Enter]を押します。
「構造」ウィンドウでコード要素を選択した状態で右クリックし、「Javadocコメントの追加」を選択します。
ドキュメント・コメント用のテンプレートがファイルに挿入されます。このテンプレートにコード要素の情報を追加してください。
作成するすべてのプロジェクトは、JDeveloperプロジェクトのデフォルト設定か、またはワークスペース共通ですべてのプロジェクトに対してユーザーが指定した設定になります。これらのデフォルト設定は、プロジェクトごとに置き換えることもできます。これらのプロパティの設定方法はどちらの場合でも同じであり、情報の場所および適用対象のみが異なります。
個々のプロジェクトのJavadocプロパティを設定するには、次のようにします。
アプリケーション・ナビゲータでプロジェクトを選択します。
メイン・メニューから、「アプリケーション」→「プロジェクト・プロパティ」を選択するか、右クリックして「プロジェクト・プロパティ」を選択します。
「プロジェクト・プロパティ」ダイアログ・ボックスが表示されます。
必要に応じて、プロジェクト・プロパティを変更します。
完了後、「OK」をクリックして「プロジェクト・プロパティ」ダイアログを閉じます。
Javaソース・エディタでの作業中、クイックJavadoc機能を使用すると、コード要素(クラス、インタフェースまたは個々のメンバー)のJavadoc生成ドキュメントに簡単にアクセスできます。
クイックJavadoc機能は、選択したエンティティをソースパスで参照し、ポップアップ・ウィンドウで入力されたJavadocコメントを表示します。コード要素に対してJavadocコメントが存在しない場合には、空のJavadocコメントが表示されます。次のいずれかが満たされる場合には、ソース・コードを使用できます。
コード要素のJavadocを表示するには、次のようにします。
コード要素を選択します。
メイン・メニューから、「ソース」→「クイックJavadoc」を選択するか、エディタ内で右クリックして「クイックJavadoc」を選択します。
その要素のドキュメントを表示するポップアップ・ウィンドウが開きます。そのウィンドウ以外の任意の場所をクリックしてウィンドウを閉じます。
クイックJavadoc機能は、選択したソース・コードが次の条件を満たしている場合に使用できます。
このプロジェクトのソースパスにある。
現在のプロジェクトが依存しているプロジェクトのソースパスにある。
このプロジェクトに割り当てられたライブラリに使用できる。
使用中のJDKの一部である。
JDeveloperには、プロジェクトを構築するための次の機能が用意されています。
「メイク」/「再ビルド」オプション
Ant
Apache Maven
「メイク」コマンドおよび「再ビルド」コマンドは、JDeveloperでプロジェクトをコンパイルするための標準操作を実行します。
「プロジェクトのメイク」では、プロジェクトが依存しているすべてのプロジェクトを(再帰的に)メイクしてから、プロジェクトをメイクします。
「プロジェクトのメイク」では、プロジェクトをメイクしますが、依存しているプロジェクトはメイクしません。
「プロジェクトの再ビルド」では、プロジェクトが依存しているすべてのプロジェクトを(再帰的に)再ビルドしてから、プロジェクトを再ビルドします。
「プロジェクトのみ再ビルド」では、プロジェクトを再ビルドしますが、依存しているプロジェクトは再ビルドしません。
「メイク」操作によって、最後にコンパイルされてから変更されたソース・ファイルや依存性が変更されたソース・ファイルをコンパイルします。一方、「再ビルド」操作の場合、ソース・ファイルを無条件にコンパイルします。「メイク」は、個々のソース・ファイル、作業セット、またはパッケージ、プロジェクトおよびワークスペースなどのコンテナに対してメイクを起動できます。
より選択的にコンパイルする場合、Antビルドファイルをプロジェクトに追加したり、追加ターゲットを定義できます。また、Antを実行してこれらのターゲットを作成できます。
現在進行中のコンパイルを取り消すには、メイン・ツールバーの「ビルドの取消」アイコンをクリックします。このアイコンをクリックすると、「コンパイラ - ログ」ウィンドウの最上部の行にエラー・メッセージが出力されます。
ソース・ファイルを作成するには、次のようにします。
ファイルのソース・エディタ・ウィンドウで、右クリックして「メイク」を選択します。
ナビゲータで1つ以上のプロジェクトを選択し、ツールバーで「メイク」をクリックします。
ナビゲータで1つ以上のプロジェクトを選択し、「ビルド」メニューから「メイク」の項目を選択します。
ナビゲータで1つ以上のプロジェクトを選択し、右クリックして「メイク」を選択します。
「再ビルド」操作によって、プロジェクトまたはワークスペース内のすべてのソース・ファイルをコンパイルします。変更されたソース・ファイルまたは依存性が変更されたソース・ファイルのみを再コンパイルする「メイク」操作とは異なり、「再ビルド」操作には、条件はありません。
より選択的にコンパイルする場合、Antビルドファイルをプロジェクトに追加したり、追加ターゲットを定義できます。また、Antを実行してこれらのターゲットを作成できます。
現在進行中のコンパイルを取り消すには、メイン・ツールバーの「ビルドの取消」アイコンをクリックします。このアイコンをクリックすると、「コンパイラ - ログ」ウィンドウの最上部の行にエラー・メッセージが出力されます。
ソース・ファイルを再構築するには、次のようにします。
ナビゲータでソース・ファイルを1つ以上選択し、右クリックして、「再ビルド」(1つのファイルの場合)または「選択されたものを再ビルド」(複数のファイルの場合)をクリックします。
ナビゲータで1つ以上のプロジェクトまたはワークスペースを選択し、ツールバーで「再ビルド」をクリックします。
ナビゲータで1つ以上のプロジェクトまたはワークスペースを選択し、「ビルド」メニューから「再ビルド」の項目を選択します。
ナビゲータで1つ以上のプロジェクトまたはワークスペースを選択し、右クリックして「再ビルド」を選択します。
JDeveloperでは、ビルド時に依存性を分析することにより、コンパイルを高速かつ完全に行うことができます。依存性チェックにより、相互に依存するソース・ファイルの不要なコンパイルを減らし、編集およびコンパイルのサイクルを高速化できます。
JDeveloperを使用してコンパイルを行う際に、「メイク」を使用してコンパイルする場合は、常に依存性チェックが実行されます。「メイク」では、JDeveloper内で自動的に作成される依存性ファイルが使用されます。
コマンドラインからコンパイルする場合は、次のパラメータを指定して依存性ファイルを作成または使用します。
javac -make
<makedepfile>
「プロジェクト・プロパティ」でオプションを設定すると、プロジェクトごとに、Javaコンパイラを構成できます。たとえば、コンパイラで次のようなメッセージが表示されないようにしたい場合があります。
例18-3 コンパイラ・メッセージ
Note: Some input files use unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
プロジェクト・プロパティをコンパイル用に設定するには、次のようにします。
ナビゲータでプロジェクトを右クリックし、ポップアップ・メニューから「プロジェクト・プロパティ」を選択します。
アプリケーション・ナビゲータで、プロジェクト・ノードをダブルクリックすることもできます。
「プロジェクト・プロパティ」ダイアログで、「コンパイラ」ノードを開きます。
Javacノードを開きます。
オプションで、「警告」ノードを開きます。
オプションとしてまずここをクリックすると、どのオプションがデフォルトでオンになるかを確認できます。たとえば、「-Xlint:all」がオンになっている場合、すべての-Xlint
警告がオンになります。
図18-0で示されている「-Xlint:unchecked」メッセージを表示しないようにするには、「プロジェクト・プロパティ」ダイアログの個別のメッセージをオフ・セクションに進みます。これで、特定のXlintメッセージのみ表示をオフにし、他のメッセージはデフォルトで表示するようにできます。
オプションで、個別のメッセージをオフ・ノードを開きます。
「-Xlint Unchecked」チェック・ボックスを選択します。
すべてのダイアログを閉じて再コンパイルします。
注意: コンパイル前にすべてのプロジェクト・ファイルを自動的に保存するには、「プリファレンス」ダイアログの「環境」ページで指定します。 |
コンパイラによるマルチバイト文字の解釈方法を制御するコード体系を指定できます。指定しない場合、プラットフォームのデフォルトのネイティブ・エンコーディング・コンバータが使用されます。
テキスト文字は、様々なコード体系を使用して表現されます。これらは、Windows環境ではコード・ページ、Javaではネイティブ・エンコーディングと呼ばれます。データをあるコード体系から別のコード体系に移動する場合、変換が必要です。各体系の拡張キャラクタ・セットは異なる場合があるので、変換によってデータが失われないようにする必要があります。
JDeveloperソース・エディタを含むほとんどのテキスト・エディタでは、動作しているプラットフォームのネイティブ・エンコーディングが使用されます。たとえば、日本語のWindowsではシフトJISが使用されます。ソース・コードがシフトJISを使用してエンコードされている場合、これを米語のWindows環境でコンパイルするには、ソースが正しく読み込まれるようにコンパイラに対してシフトJISエンコーディングを指定する必要があります。
JDeveloperは、現在インストールされているJ2SEに含まれている文字コード体系をサポートしています。
エンコーディング・オプションを設定するには、次のいずれかを実行します。
JDeveloperで、「アプリケーション」→「プロジェクト・プロパティ」を選択します。「プロジェクト・プロパティ」ダイアログで、「コンパイラ」ノードを選択します。
コマンドラインで、javacコマンドと-encoding
オプションを使用し、その後ろにエンコーディング名を入力します。
次のいずれかの方法で、エンコーディング名を選択します。
「文字コード」ドロップダウン・リストから名前を選択します。
使用環境のデフォルト・エンコーディングを使用する場合は、「文字コード」ドロップダウン・リストから「default」を選択します。
Java SDKでサポートされるエンコーディングの一覧は、次を参照してください。
http://download.oracle.com/javase/6/docs/technotes/guides/intl/encoding.doc.html
JDeveloperは、Javaコンパイラ(Javac)を使用してJavaソース・コード(.java
ファイル)をJavaバイトコード(.class
ファイル)にコンパイルします。生成されるバイトコードは、Java Virtual Machine (JVM)のマシン・コードです。Javaソース・ファイルのコンパイルにより、各クラス宣言およびインタフェース宣言に対して個別のクラス・ファイルが生成されます。生成されたJavaプログラムを特定のプラットフォームで実行すると、そのJVMによってclassファイルに含まれるバイトコードが実行されます。
Javacでは、指定されたJavaファイルの他に、対応するクラス・ファイルのないインポート・ファイルがコンパイルされます。(-make
オプションを使用して)依存性チェックを指定しないかぎり、すべてのターゲットJavaファイルがコンパイルされます。詳細は、第18.6.1.3項「依存性チェックの理解」を参照してください。
JDeveloper内部で操作する場合、コンパイラとしてJavacが使用されます。コンパイラのオプションは、「プロジェクト・プロパティ」→「コンパイラ」→「Option」で設定できます。
次のコマンドライン・オプションがサポートされています。
-classpath path
クラスの検索に使用するパス。デフォルトのCLASSPATHまたはCLASSPATH環境変数より優先されます。ディレクトリはセミコロンで区切ります。たとえば、myclassesディレクトリ内のクラスfoo.javaを検索するには、次のように入力します。
javac -classpath c:\mydir
;c:\jdeveloper
\myclasses foo.java (Windows) javac -classpath ~/mydir;/usr
/jdeveloper
/myclasses foo.java (UNIX)
Java 2プラットフォームを使用している場合(デフォルトのターゲットはJDK 1.6)、CLASSPATHの前にSYSTEM CLASSPATHが追加されます。前述の例では、SYSTEMCLASSPATHは次のようになります。
Windows
%JAVAHOME%\jre\lib\rt.jar; %JAVAHOME%\jre\lib\i18n.jar; %JAVAHOME%\jre\lib\sunrsasign.jar; %JAVAHOME%\jre\lib\jsse.jar; %JAVAHOME%\jre\lib\jce.jar; %JAVAHOME%\jre\lib\charsets.jar; %JAVAHOME%\jre\lib\classes; c:\mydir
; c:\jdeveloper
\myclasses
UNIX
$JAVA_HOME/lib/rt.jar; $JAVA_HOME/lib/i18n.jar; $JAVA_HOME/lib/sunrsasign.jar; $JAVA_HOME/lib/jsse.jar; $JAVA_HOME/lib/jce.jar; $JAVA_HOME/lib/charsets.jar; $JAVA_HOME/lib/classes;~/mydir;
/usr/jdeveloper
/myclasses
JAVAHOMEが定義されていない場合は、jdev.conf
内のSetJavaHome
で定義されたJDKが使用されます。JAVAHOMEが存在しない場合は、<jdev_install
>/jdeveloper/jdk内のJDK (存在する場合)が使用されます。
ターゲットJDKが1.6 (-target 1.6を使用)の場合、CLASSPATHにSYSTEM CLASSPATHが追加されます。前述の例では、次のようになります。
Windows
c:\mydir
; c:\jdeveloper
\myclasses %JAVAHOME%\lib\classes.zip %JAVAHOME%\classes
UNIX
~/mydir;
~/usr/jdeveloper
/myclasses $JAVAHOME/lib/classes.zip; $JAVAHOME/classes
SYSTEMCLASSPATHを変更するには、-sysclasspathオプションまたは-bootclasspathオプションを使用します。
-sourcepath pathlist
必要なJavaファイルの検索に使用するパスのセミコロンで区切られたリスト。
-sysclasspath pathlist
システム・クラス・ファイルの検索に使用するパスのセミコロンで区切られたリスト。
-bootclasspath pathlist
-sysclasspath
と同等。
-d outdir
クラス(宛先)ファイル階層のルート・ディレクトリ。次に例を示します。
javac -d C:\JDeveloper\myclasses JavaBean.java
(Windows)
javac -d ~/usr/jdeveloper/myclasses JavaBean.java
(Unix)
この場合、JavaBean.java
に、MyPackage
というパッケージ文が含まれていると仮定すると、JavaBean.java
ソース・ファイルで定義されたクラスのclassファイルは、C:¥JDeveloper¥myclasses¥MyPackage
ディレクトリに保存されます。
Javaファイルは、SOURCEPATHから読み取られ、クラス・ファイルはCLASSPATHディレクトリに書き込まれます。宛先ディレクトリは、CLASSPATHに含まれる場合もあります。デフォルトの宛先は、ソース・ファイルのパッケージ構造と一致し、ソースのルート・ディレクトリから始まります。
-deprecation:self
推奨されていないタイプ、フィールドおよびメソッドがクラスに定義されている場合に、それらの使用方法を検出します。
-encoding name
ネイティブ・エンコーディング名(またはコード・ページ名)を指定して、コンパイラがASCIIキャラクタ・セット以外の文字を解釈する方法を制御できます。デフォルトでは、プラットフォームのデフォルトのネイティブ・エンコーディング・コンバータが使用されます。詳細は、第18.6.1.5項「コンパイル用のネイティブ・エンコーディングの指定方法」を参照してください。
たとえば、次のように指定します。
javac -encoding SJIS JavaBean.java
この場合、JavaBean.java
、およびクラス・ファイルのない直接インポートしたJavaファイルがコンパイルされます。ソース・ファイルの文字は、日本語の場合すべてシフトJISキャラクタ・セットとして解釈されます。
-endorseddirs pathlist
Sun社が提供するデフォルト推奨規格のJDKクラスjava.endorsed.dirsのデフォルト値をオーバーライドできます。pathlistでは、パス名をセミコロンで区切ります。
-extdirs pathlist
コンパイラが拡張機能を検索する場所をオーバーライドするパスのセミコロンで区切られたリスト。
-g
クラス・ファイルにデバッグ情報を生成します。クラスのデバッグ中にローカル変数などの情報にアクセスする場合に必要です。
-g:none
クラス・ファイルにデバッグ情報を生成しないように指定します。
-g:source,lines,vars
クラス・ファイルに選択的なデバッグ情報を生成します。
-help
-?
コンパイラのオプションを表示します。
-make depfilename
依存性チェックに指定の依存性ファイルを使用します。指定したファイルが見つからない場合は作成されます。
-msglimit:#
出力に書き込まれるエラーおよび警告の最大数です。無制限にするには、-1を使用します。デフォルトは1000です。
-noquiet
コンパイルされているファイルの名前を表示します。
-nowarn:<id>
引数を付けて指定すると、ユーザーが入力した番号に関連付けられている警告を抑止します。
-nowarn:486
未使用のimport
文を抑止します。
-nowarn:487
部分使用のimport
文を抑止します。
-nowarn
と-warn
を次のように組み合せることもできます。
-nowarn -warn:487
警告487のみ出力します。
-nowrite
クラス・ファイルを出力せずにプログラムをコンパイルします。
-p packagename(s)
指定したパッケージ内で見つかったソース・ファイルをすべてコンパイルします。
-rebuild
依存性に関係なく、指定されたファイルを再ビルドします。-makeオプションが使用されていないかぎり、再ビルドになります。
-recurse [level]
コンパイラに、ワイルド・カードを含むファイル名指定を展開する際、ディレクトリ内を再帰検索するように指定します。
次に例を示します。
javac -recurse foo/*java
これは、次のように入力することと同じです。
javac foo/bar/*java foo/lish/*java foo/lish/lee/*java
[level]オプションは、最大再帰レベルを指定するオプションの整数の引数です。
次に例を示します。
javac -recurse 1 foo/*java
これは、次のように入力することと同じです。
javac foo/bar/*java foo/lish/*java
foo/lish/lee/*java
は、[level]変数の範囲内にありません。
-s sourcefile
指定されたソース・ファイル名をコンパイルします。
-source {1.1|1.2|1.3|1.4|1.5|1.6}
デフォルトでは、ソースはJ2SE 1.5と互換性があり、ソース・コードでJ2SEアサーションが有効になります。ソースの互換性レベルをJ2SE 1.4にするには、-source 1.4を入力します。
-strictfp
中間浮動小数点計算に拡張精度を使用しないように指定します。
-target [1.1|1.2|1.3|1.4|1.5|1.6]
ターゲットが1.1に設定されている場合、コンパイラによりJSDK 1.1用にコンパイルされます。ターゲットが1.2に設定されている場合、コンパイラによりJava2 (JSDK 1.2)用にコンパイルされます。ターゲットが1.3に設定されている場合、Java 2 v1.3 (J2SE 1.3)用にコンパイルされます。ターゲットが1.4に設定されている場合、Java 2 v1.4 (J2SE 1.4)用にコンパイルされます。
デフォルトのターゲットは、Sun社のjavac
のデフォルトと一致するJDK 6 (J2SE 1.6)です。
-verbose
どのクラス・ファイルがCLASSPATHのどこからロードされたかなど、コンパイルに関する詳細な情報を提供します。次の情報を取得できます。
コンパイルされているソース・ファイル
ロードされているクラス
ロードされているクラス
-verbosepath
コンパイラで使用されるSOURCE PATHとCLASSPATHの値を表示します。
-warn:<id>
警告を指定できます。抑止する警告と組み合せて、任意の数の警告を指定できます。引数なしで使用すると、すべての警告が表示されます。有用な警告としては、次の2つがあります。
-warn:486
未使用のimport文を表示します。
-warn:487
部分使用のimport文を表示します。
-warningtag tag[, tag]
javadocのコメント・タグのリスト。リストされたタグがソースのコメント内に出現した場合に、警告を出力します。タグ名はカンマを使用して区切ります。
アプリケーション(ワークスペース)とプロジェクトをコンパイルするには2つの方法があります。
JDeveloper内部で、アプリケーションとプロジェクトのノードに対してビルドおよびコンパイルの各オプションを使用します。
コマンドラインから、ojmake
およびojdeploy
を使用します。
どちらもjdeveloper/jdev/bin
ディレクトリにあります。
ojmake
は、デプロイメントを伴わないアプリケーションとプロジェクト、たとえばデプロイメント・プロファイルが定義されていないプロジェクトなどに対して使用できます。
ojdeploy
は、すべてのアプリケーションおよびプロジェクト(デプロイメントを伴うものを含む)のビルドを扱うことができます。これは、ojmake
のスーパーセットと考えられます。
ツールのヘルプは、コマンドラインでojmake
またはojdeploy
を実行するだけで表示できます。ヘルプはコンソールに表示されます。
注意: コマンドラインから操作する場合にはJavacを使用してJavaファイルをコンパイルできますが、Javacを手動で実行してアプリケーションとプロジェクトをビルドすることはできません。 |
「クリーン」コマンドを使用して、アプリケーションまたはプロジェクトのクリーンを実行できます。このコマンドを実行すると、プロジェクトまたはアプリケーションの出力ディレクトリおよびデプロイ・ディレクトリがクリーンされます。
「クリーン」コマンドをアプリケーションまたはプロジェクトに対して実行すると、クラス・ファイル、コピーしたリソース・ファイル、およびデプロイしたファイルのすべてが削除されます。このことを実行すると、出力ディレクトリおよびデプロイ・ディレクトリに古いファイルが確実に残らないようにできます。たとえば、名前変更、移動または削除を行ったクラスと、このようなクラスに属する古いクラス・ファイルは削除する必要があります。同様に、名前変更、移動または削除を行ったリソースやデプロイと、出力ディレクトリまたはデプロイ・ディレクトリに残っているそれらの古いコピーも削除する必要があります。クリーンを実行すると、以前のビルドのアーチファクトを削除し、新規に操作を開始できます。
「クリーン」コマンドはアプリケーションまたはプロジェクトに対して実行できます。
アプリケーションのクリーンを実行すると、次の処理が行われます。
アプリケーションを構成する各プロジェクトの出力ディレクトリおよびデプロイ・ディレクトリの内容が削除されます。
アプリケーションのデプロイ・ディレクトリの内容が削除されます。
アプリケーションのデプロイ・ディレクトリの内容が削除されます。
「クリーン」コマンドを正常に実行するには、次の条件が満たされている必要があります。
クリーンするプロジェクトの出力ディレクトリ、またはクリーンするアプリケーションの各プロジェクトの出力ディレクトリが指定されていること
出力場所がファイルではなく、ディレクトリとして指定されていること
「クリーン」コマンドを使用すると、新しいビルド・プロセスを開始するために、以前のビルドから残されたアーチファクトを削除できます。
プロジェクトをクリーンするには、次のようにします。
アプリケーション・ナビゲータで、クリーンするプロジェクトを選択します。
「ビルド」メニューで、「プロジェクトのクリーン」を選択します。
「プロジェクトをクリーン中」ダイアログで、「はい」をクリックします。
アプリケーションおよびそのすべてのプロジェクトをクリーンするには、次のようにします。
アプリケーション・ナビゲータで、クリーンするアプリケーションを選択します。
「ビルド」メニューで、「すべてクリーン」を選択します。
「アプリケーションをクリーン中」ダイアログで、「はい」をクリックします。
「設定」ダイアログのJavadocページでプロジェクトに対して設定したプロパティに基づいて、APIリファレンスおよびその他のドキュメントをナビゲータから直接生成できます。ドキュメントは、ファイルのコードおよびドキュメント・コメントからjavadocユーティリティを使用して生成されます。
パッケージ、ファイルまたはプロジェクトに対してJavadocを実行するには、次のようにします。
ナビゲータで適切なノードを選択します。
メイン・メニューから「ビルド」、「Javadoc」を選択します。
Javadocがバックグラウンドで生成されます。ログ・ウィンドウに、情報および結果が表示されます。ログ・ウィンドウのリンクを使用して、index.html
ファイルをプロジェクトに追加できます。
Apache Antは、Unixのmakeユーティリティの機能と似たビルド・ツールです。Antは、XML形式のビルドファイルを使用して、アプリケーションとそのコンポーネントを構築するためのプロセスを記述および制御します。Antはクロス・プラットフォームのコンパイルをサポートしており、簡単に拡張できます。Apache Antは、Apache Software Foundationの製品です。詳細は、Webサイト(http://ant.apache.org/index.html
)を参照してください。
Antビルドファイルでは、ターゲットの定義とターゲット間の依存性の定義を行います。ターゲットは、プログラミングされたタスクのシーケンスです。Antを実行してターゲットを作成する場合、ターゲットが依存する他のターゲットを最初に作成してから、ターゲット独自のタスクを実行します。
AntはJDeveloperに統合されています。プロジェクト用のAntビルドファイルを、追加または作成できます。Antビルドファイルは、XMLソース・エディタを使用して編集できます。ユーザー・インタフェースからAntを起動することによって、ビルドファイルに定義されたターゲットを作成できます。
ビルドファイルのターゲットに対するAntの実行方法
プロジェクト・ビルドファイル内のターゲットに対して実行する場合。プロジェクトには複数のAntビルドファイルを含めることができますが、プロジェクトのビルドファイルとして指定できるのは1つのみです。「プロジェクトでAntを実行」ツールバー・アイコンおよびドロップダウン・メニューから、プロジェクトのビルドファイルのターゲットに簡単にアクセスできるように構成できます。
Antビルドファイルの編集時に「構造」ペインから実行する場合。XMLソース・エディタでAntビルドファイルを開くと、そのターゲットが構造ペインに表示されます。これらを選択して実行できます。
独自に定義した外部ツールから実行する場合。「外部ツールの作成」ウィザードを使用して、Antターゲットを作成するメニュー項目およびツールバー・ボタンを定義します。
AntをJDeveloperのメイン・メニューおよびツールバーから起動し、現在のプロジェクトのプロジェクト・ビルドファイルに定義されているターゲットを構築できます。
プロジェクトには複数のAntビルドファイルを含めることができ、これらの1つをプロジェクトのビルドファイルとして指定できます。「プロジェクトでAntを実行」ツールバー・ボタンおよびドロップダウン・メニューから、プロジェクトのビルドファイルのターゲットに簡単にアクセスできるように構成できます。
プロジェクトのビルドファイルを選択して構成するには、Antプロジェクトのプロパティ・ページに移動します(「アプリケーション」→「プロジェクト・プロパティ」を選択)。
プロジェクト・ビルドファイルのターゲットに対してAntを実行するには、次のようにします。
ツールバーで、「プロジェクトでAntを実行」をクリックします。
Antによって、プロジェクトに指定されているデフォルトのターゲットが作成されます。
メイン・メニューから「ビルド」→「プロジェクトでAntを実行」を選択します。
Antによって、プロジェクトに指定されているデフォルトのターゲットが作成されます。
ツールバーの「プロジェクトでAntを実行」ドロップダウン・メニューからターゲットを選択します。
Apache Mavenは、ソフトウェア・プロジェクトの管理と検査のためのツールです。Mavenはプロジェクトのビルド、レポート、中心的な情報からのドキュメンテーション、プロジェクト・オブジェクト・モデル(POM)を管理できます。プロジェクトのビルドにはこのPOMと、Mavenによって全プロジェクトで共有される一連のプラグインを使用するため、統一的なビルド・システムとなります。Mavenをプラグインで拡張すれば、レポートやプロセスのビルドに様々な開発ツールを使用できます。Mavenの詳細は、http://maven.apache.org/index.html
を参照してください。
プロジェクト・オブジェクト・モデル(POM)は、Mavenがプロジェクトをビルドする際に使用するプロジェクトと構成詳細に関する情報を含むXMLファイルです。プロジェクトのビルドに必要なほとんどの情報が、このXMLファイルに含まれています。POMで指定できる構成情報としては、プロジェクトの依存性、プラグイン、実行可能なゴール、ビルド・プロファイルなどがあります。
Mavenプロジェクト・オブジェクト・モデルの詳細は、次のサイトを参照してください。http://maven.apache.org/index.html
「新規ギャラリ」のオプションを使用して次の操作を実行します。
新規のApache Maven POMを作成
アプリケーションのPOMを作成
プロジェクトからMaven POMを生成
POMを作成するには、次のようにします。
「ファイル」→「新規」を選択し、「新規ギャラリ」を開きます。
「カテゴリ」リストで、「一般」を開いて「Maven」を選択します。
POMを作成するオプションを選択し、「OK」をクリックします。
アプリケーション・ナビゲータで選択した既存のプロジェクトに基づいて、Maven POMを作成できます。複数のソース・ディレクトリについてビルド要素が追加されます。プロジェクトに対して指定したJavaコンパイラに関する設定が追加されます。
プロジェクトからMaven POMを作成するには、次のようにします。
アプリケーション・ナビゲータで、POMを作成する元のプロジェクトを選択します。
「ファイル」→「新規」を選択し、「新規ギャラリ」を開きます。
「カテゴリ」リストで、「一般」を開いて「Maven」を選択します。
「プロジェクトからMaven POMを生成」を選択します。
「OK」をクリックします。
選択したアプリケーションに対して新規のプロジェクト・オブジェクト・モデル(POM)を生成し、オプションでアプリケーションの各プロジェクトに対する新規POMを生成します。これによって、アプリケーションの最上位POMと、プロジェクトごとのPOMが生成されます。
アプリケーションからPOMを生成するには、次のようにします。
「ファイル」、「新規」を選択し、「新規ギャラリ」を開きます。
「カテゴリ」リストで、「一般」を開いて「Maven」を選択します。
「アプリケーションのPOMの作成」を選択し、「OK」をクリックします。
次のテンプレートを作成できます。
1つ以上のMavenプロジェクトから作成されるMavenアプリケーション・テンプレート。
アプリケーション、アプリケーションの最上位プロジェクト・オブジェクト・モデル・ファイル(pom.xml
)、およびプロジェクトごとのデフォルトのpom.xml
ファイルが生成されます。
Mavenプロジェクト・テンプレート。
デフォルトのプロジェクト・オブジェクト・モデル・ファイルとMaven構成を含むJavaプロジェクトが生成されます。プロジェクト・オブジェクト・モデル・ファイルは、プロジェクトの作成中に自動的に作成されます。
デフォルトのPOMを使用してJDeveloperプロジェクトを作成するには、次のようにします。
「ファイル」、「新規」を選択し、「新規ギャラリ」を開きます。
「すべての項目」を選択します。
「Mavenアプリケーション」または「Mavenプロジェクト」を選択します。
「OK」をクリックします。
アプリケーション・ナビゲータを使用し、Mavenプロジェクトを検索して実行します。
Mavenプロジェクトを実行するには、次のようにします。
ナビゲータで、実行するpom.xml
ファイルを含むプロジェクトを検索します。
pom.xml
ファイルは通常、プロジェクトの「リソース」フォルダにあります。
pom.xml
ファイルを右クリックします。
ポップアップ・メニューで「ゴールの実行」を選択し、ゴールを選択します。
ポップアップ・メニューに表示されるゴールのリストは、「Maven」の「ゴール」プロパティ・ダイアログを使用して設定します。
Mavenプロジェクトのプロパティ・ダイアログで、使用するMavenのバージョンを指定できます。Mavenバージョン2.0以上がサポートされます。
Mavenのバージョンを指定するには、次のようにします。
アプリケーション・ナビゲータで、プロパティを設定するプロジェクトを検索します。
プロジェクト名を右クリックします。
「プロジェクト・プロパティ」を選択します。
「Maven」を選択します。
使用するMavenのバージョンを「Mavenバージョンの指定」フィールドに入力します。
Mavenの「プロジェクト・プロパティ」ダイアログ・ボックスを使用して、次の内容を指定します。
使用するMavenのバージョン
settings.xml
ファイルの場所
pom.xml
ファイルの場所
追加のクラスパス・エントリ
依存性
「ゴールの実行」ポップアップ・メニューに表示される選択肢
Javaバージョン
環境変数
Mavenのリポジトリ
コマンドライン・オプション
Mavenのプロジェクト・プロパティを設定するには、次のようにします。
アプリケーション・ナビゲータで、プロパティを設定するプロジェクトを検索します。
プロジェクト名を右クリックします。
「プロジェクト・プロパティ」を選択します。
「Maven」を選択します。
プロパティ・ダイアログの名前を選択します。
クラス・モデルのXMIエクスポートを編集して、プロファイルを手動で作成できます。
プロファイルには1つ以上のステレオタイプがあり、属性(プロパティ)、および特定のステレオタイプで拡張できるメタクラスを決定する拡張があります。プロファイル、ステレオタイプおよび拡張の形式は、それぞれ、パッケージ、クラスおよびアソシエーションと同じなので、標準のUMLサポートを使用して、プロファイルの基礎として使用するXMLを作成できます。
手動でプロファイルを作成するには、次のようにします。
UMLプロジェクトを作成します。
MyProfile
という名前のルート・パッケージを作成します。
MyStereotype
という名前のクラスを作成します。
String
でタイプを指定された、myAttribute
という名前のクラスに所有された属性を作成します。
タイプを指定されていない、base_Class
という名前のクラスに所有された属性を作成します。
A_base_Class_myStereotype
という名前のアソシエーションを作成します。
MyProfile::MyStereotype
でタイプを指定された、myStereotype
という名前の所有された端点を作成します。
アソシエーションのmemberEnd
プロパティを更新してMyProfile::MyStereotype::base_Class
も含めます。
「ファイル」→「エクスポート」→「UMLをXMIとして」を選択します。
ファイルは、例18-4のように表示されます。
例18-4 11.1.2.0.0プロファイル・コード
<?xml version='1.0' encoding='UTF-8' standalone='yes'?> <xmi:XMI xmi:version='2.1' xmlns:xmi='http://schema.omg.org/spec/XMI/2.1' xmlns:uml='http://schema.omg.org/spec/UML/2.1.1/uml.xml'> <documentation exporter='Oracle JDeveloper' exporterVersion='11.1.2.0.0'/> <uml:Package xmi:id='urn:uuid:e758ac95-c939-437c-b8db-93b614d7a1e6' name='MyProfile'> <packagedElement xmi:type='uml:Association' xmi:id='urn:uuid:bedc874e-54bb-43ac-8118-332da29ee332' name='A_base_Class_myStereotype' memberEnd='urn:uuid:9b0a1dac-f235-4c0f-8d23-5d050869376e urn:uuid:c148a047-b02d-4144-a49d-e1ee6d363ae2'> <ownedEnd xmi:id='urn:uuid:9b0a1dac-f235-4c0f-8d23-5d050869376e' name='myStereotype' association='urn:uuid:bedc874e-54bb-43ac-8118-332da29ee332' type='urn:uuid:61415c2c-2835-42cd-87e7-9d95a8675bc3'/> </packagedElement> <packagedElement xmi:type='uml:Class' xmi:id='urn:uuid:61415c2c-2835-42cd-87e7-9d95a8675bc3' name='MyStereotype'> <ownedAttribute xmi:id='urn:uuid:bae8137e-8efc-4311-9cb6-bac77d25cef1' name='myAttribute'> <type href='http://schema.omg.org/spec/UML/2.1.1/uml.xml#String'/> </ownedAttribute> <ownedAttribute xmi:id='urn:uuid:c148a047-b02d-4144-a49d-e1ee6d363ae2' name='base_Class' association='urn:uuid:bedc874e-54bb-43ac-8118-332da29ee332'/> </packagedElement> </uml:Package> </xmi:XMI>
xmlns:cmof='http://schema.omg.org/spec/MOF/2.0/cmof.xml'
をxmi:XMI
要素に追加します。
パッケージxmi:id
の値を_0に変更します。
uri='http://example.oracle.com/MyProfile.xmi'
をuml:Package
要素に追加します。
base_Class
属性の子として<type href='http://schema.omg.org/
を追加します。
spec/UML/2.1.1/uml.xml#Class'/>
uml:Package
をuml:Profile
に置換します。
uml:Class
をuml:Stereotype
に置換します。
uml:Association
をuml:Extension
に置換します。
ownedEnd
をownedEnd xmi:type='uml:ExtensionEnd'
に置換します。
xmi:XMI
の子として<cmof:Tag name='org.omg.xmi.nsURI' value='http://example.oracle.com/MyProfile' element='_0'/>
を追加します。
ファイルは、例18-5のように表示されます。
例18-5 11.1.2.0.0プロファイル・コード
<?xml version='1.0' encoding='UTF-8' standalone='yes'?> <xmi:XMI xmi:version='2.1' xmlns:xmi='http://schema.omg.org/spec/XMI/2.1' xmlns:uml='http://schema.omg.org/spec/UML/2.1.1/uml.xml' xmlns:cmof='http://schema.omg.org/spec/MOF/2.0/cmof.xml'> <documentation exporter='Oracle JDeveloper' exporterVersion='11.1.2.0.0'/> <uml:Profile xmi:id='_0' name='MyProfile' uri='http://example.oracle.com/MyProfile.xmi'> <packagedElement xmi:type='uml:Extension' xmi:id='urn:uuid:bedc874e-54bb-43ac-8118-332da29ee332' name='A_base_Class_myStereotype' memberEnd='urn:uuid:9b0a1dac-f235-4c0f-8d23-5d050869376e urn:uuid:c148a047-b02d-4144-a49d-e1ee6d363ae2'> <ownedEnd xmi:type='uml:ExtensionEnd' xmi:id='urn:uuid:9b0a1dac-f235-4c0f-8d23-5d050869376e' name='myStereotype' association='urn:uuid:bedc874e-54bb-43ac-8118-332da29ee332' type='urn:uuid:61415c2c-2835-42cd-87e7-9d95a8675bc3'/> </packagedElement> <packagedElement xmi:type='uml:Stereotype' xmi:id='urn:uuid:61415c2c-2835-42cd-87e7-9d95a8675bc3' name='MyStereotype'> <ownedAttribute xmi:id='urn:uuid:bae8137e-8efc-4311-9cb6-bac77d25cef1' name='myAttribute'> <type href='http://schema.omg.org/spec/UML/2.1.1/uml.xml#String'/> </ownedAttribute> <ownedAttribute xmi:id='urn:uuid:c148a047-b02d-4144-a49d-e1ee6d363ae2' name='base_Class' association='urn:uuid:bedc874e-54bb-43ac-8118-332da29ee332'> <type href='http://schema.omg.org/spec/UML/2.1.1/uml.xml#Class'/> </ownedAttribute> </packagedElement> </uml:Profile> <cmof:Tag name='org.omg.xmi.nsURI' value='http://example.oracle.com/MyProfile' element='_0'/> </xmi:XMI>
JDeveloperでは、コンポーネント・パレット上にすぐ使用できるJavaBeansのセットが備わっています。また、ユーザー自身が新規JavaBeansを作成したり、サード・パーティのJavaBeansをインストールすることで、これらのコンポーネントを補完できます。
JavaBeansコンポーネント・テクノロジにより、Javaオブジェクトのデータ取得、永続性および操作に対して独自のフレームワークを実装できます。JavaBeansテクノロジは、JavaアプレットおよびJavaクライアント・アプリケーションのビルドに再利用可能なソフトウェア・コンポーネントを作成するために使用できます。Java EEアプリケーションでは、アプレットおよびアプリケーション・クライアントは、Web層コンポーネントを介してビジネス層コンポーネントと直接または間接的に通信できます。たとえば、ブラウザで実行されているクライアントは、JSPページまたはサーブレットを介してビジネス層と通信します。
JavaBeansコンポーネントはJava EE仕様ではJava EE Webコンポーネントとみなされませんが、JavaBeansコンポーネントは、サーバー・コンポーネントとクライアント層のアプリケーション・クライアントまたはアプレット間、またはサーバー・コンポーネントとバックエンドのデータベース間のデータ・フローを処理するために使用されます。
JavaBeansの基本的な概念やBeanの構成要素など、JavaBeansの詳細は、http://download.oracle.com/javase/tutorial/javabeans/
を参照してください。チュートリアルには、簡単なBeanの記述、Beanのプロパティ、イベントの操作、その他に関する演習も含まれています。
JavaBeansは、Javaビジュアル・エディタでプログラムの構築に使用されるJava構成要素です。各JavaBeanは、ユーザー・インタフェース・オブジェクト、データ対応コントロールまたはシステム機能などのプログラム要素を表します。これらの要素を選択および連結してプログラムを構築します。
今後のUI設計作業の所要時間を短縮するために、コンポーネント・パレットに追加してそのまま(または軽微な変更のみで)再利用できるJavaBeanコンポーネント(ツールバー、ステータス・バー、チェック・ボックス・グループまたはダイアログ・ボックスなど)を作成します。
JDeveloperでは、コンポーネント・パレット上にすぐ使用できるJavaBeansのセットが備わっています。また、ユーザー自身が新規JavaBeansを作成したり、サード・パーティのJavaBeansをインストールすることで、これらのコンポーネントを補完できます。
JavaBeansは、trueオブジェクト指向プログラミング(OOP)の観念におけるオブジェクトです。trueオブジェクトであるため、JDeveloperコンポーネントには次の特徴があります。
一部のデータ・セットおよびデータアクセス機能のカプセル化。
スーパークラスからのデータおよび動作の継承。
共通スーパークラスから導出された他のオブジェクトと置き換えても同じように機能する多相性。
各コンポーネントは、ウィンドウやダイアログ・ボックス、データベース内のフィールドまたはシステム・タイマーなどの一部のプログラム要素をカプセル化します。ビジュアル・コンポーネントは、最終的にjava.lang.Object
またはそこから導出される他の一部のクラス(javax.swing.Panel
など)を拡張する必要があります。非ビジュアルJavaBeansコンポーネントではこれは必要ありません。
JDeveloperで認識および使用されるためには、コンポーネントがJavaBeans仕様に準拠している必要があります。
プログラムで役立つために、JavaBeanは、その他のコンポーネントにより操作またはこれらのコンポーネントと対話できる手段を提供する必要があります。JavaBeansは、プロパティ、メソッドおよびイベントを定義することでこの要件を満たします。
すべてのコンポーネントには、プロパティ、メソッドおよびイベントが組み込まれています。コンポーネントが提供する一部のプロパティ、メソッドおよびイベントは、実際には祖先のクラスから継承されます。つまり、これらの要素をその他のコンポーネントと共有することを意味します。たとえば、UIコンポーネントはすべて、コンポーネントの背景色を表すbackground
というプロパティを継承します。各コンポーネントは、独自の一意のプロパティ、メソッドおよびイベントを導入することもできます。たとえば、Swingチェックボックス・コンポーネントにはselected
というプロパティがあり、このコンポーネントが初期状態で選択されて表示されるかどうかを示します。
再利用可能なBeanを開発するための最初のステップは、JavaBeanクラスの作成です。「Beanの作成」ダイアログを使用して、新規の空のBeanを作成するか、またはJavaBeansのコンポーネント・モデルの要件を満たすよう既存のクラスを拡張します。
JavaBeanを作成するには、次のようにします。
アプリケーション・ナビゲータで、Beanを追加するプロジェクトを選択します。
メイン・メニューから、「ファイル」→「新規」を選択するか、右クリックして「新規」を選択します。
新規ギャラリの「カテゴリ」ツリーで、「一般」を開き、「Java」を選択します。
「項目」リストで、「Bean」をダブルクリックします。
「Beanの作成」ダイアログで、デフォルトを受け入れるか、新規の値を入力するか、または「参照」ボタンを使用して既存のパッケージおよびスーパークラスに移動します。
「OK」をクリックします。
BeanInfoクラスは、実装するBeanに関する明示的な情報をBean実装者が指定できる、一連のメソッドを定義します。BeanコンポーネントにBeanInfoを指定すると、メソッドを隠す、ツールボックスのアイコンを指定する、プロパティに説明的な名前を指定する、バインドされるプロパティを定義する、などが可能になります。
Beanを作成してコンポーネント・パレットにインストールするときに、ほとんどの場合、JDeveloperのインスペクタにプロパティとイベントを表示させます。Beanの作成時にJavaBeansの設計規則および命名規則に従った場合、定義したすべてのプロパティとイベント、およびスーパークラスから継承されるすべてのプロパティとイベントが自動的に表示されます。
ただし、JavaBeansの設計規則および命名規則を使用しなくてもかまいませんし、そのような規則を使用しない既存のクラスを使用することもできます。また、設計時には、Beanのユーザーがすべてのプロパティにアクセスできないようにしたい場合もあります。
このような状況を処理するために、自動イントロスペクションを使用してJDeveloperで情報を導出するのではなく、Beanに関する明示的な情報をJDeveloperに提供するBeanInfoクラスを作成できます。このクラスを作成するには、SimpleBeanInfo
クラスを拡張します。
「BeanInfoの作成」ダイアログを使用してBeanInfoクラスを作成するには、次のようにします。
アプリケーション・ナビゲータで、Beanを追加するプロジェクトを選択します。
メイン・メニューから、「ファイル」→「新規」を選択するか、右クリックして「新規」を選択します。
新規ギャラリの「カテゴリ」ツリーで、「一般」を開き、「Java」を選択します。
「項目」リストで、「BeanInfo」をダブルクリックします。
「BeanInfoの作成」ダイアログで、BeanInfoを作成するBeanを選択します。このダイアログでは、Bean自体からBeanInfoクラス名が生成されます。
パッケージ名を受け入れるか、BeanInfoを追加する別のパッケージを指定します。
「参照」をクリックして、実装するBeanInfoについてSimpleBeanInfo
以外のベース・クラスを選択します。
「OK」をクリックして、新規BeanInfoクラスをプロジェクトに追加します。
Javaビジュアル・エディタで、エンド・ユーザーがイベントを認識するのは、主としてコンポーネントが含まれるクラスで実装する必要があるイベント処理メソッドとしてです。たとえば、button1
という名前のボタンをFrame1
というコンテナに配置するとします。また、エンド・ユーザーがbutton1
をクリックしたときにはなんらかの処理を実行します。
イベント処理メソッドを実装するには、次のようにします。
Frame1エディタでbutton1を選択します。
プロパティ・インスペクタの「イベント」ページまで移動します。
actionPerformed
の右側をクリックします(actionPerformed
は、ボタンが押されたときに生成されるイベントです)。
これにより、デフォルトのアクション・リスナー名(編集可能)が作成されます。
この名前をダブルクリックして、JDeveloperに適切なメソッドを作成するように指示し、メソッド本体へ移動します。
JDeveloperはFrame1
のソース・ビューに切り替わり、そのイベントの発生時にコールされるイベント処理メソッドがFrame1
に挿入されます。
メソッドのデフォルト名はbutton1_actionPerformed()
です。メソッドの本体は、最初は空です。
ボタンが押されたときに応答するコードをメソッドに追加します。
エンド・ユーザーには、button1
から発生する可能性のあるイベントがすべてプロパティ・インスペクタのイベント・ページにリスト表示されます。コンポーネントの作成者は、コンポーネント・クラスを作成する際に、そのクラスで生成されるすべてのイベントがプロパティ・インスペクタに表示されるようにする責任があります。Beanを使用するためにエンド・ユーザーに必要なことは、イベント処理メソッドのコードを記述することのみです。
バックグラウンドで、JDeveloperはイベント・リスニングの他の側面を処理する追加コードもFrame1.java
ファイルに生成します。
ActionListener
インタフェースを実装するアクション・アダプタの匿名の内部クラスを生成します。
これによってFrame1
でのクラスがインスタンス化されます。
button1.addActionListener()
をコールすることにより、自分自身をbutton1イベントのリスナーとして登録します。
このコードはすべてソース・ビューに表示されますが、主たるタスクは、イベント発生時にアクション・アダプタによってコールされるイベント処理メソッドを記述することです。
JDeveloperによりデフォルトで生成される特定のタイプの内部クラス・イベント・アダプタは、匿名アダプタと呼ばれます。このスタイルのアダプタは、別個の(名前付き)アダプタ・クラスを作成しません。その結果、コードは簡潔になります。
例18-6に示すコードは、アクションが実行されたイベント用に、匿名アダプタを使用して生成されたものです。
「プロジェクト・プロパティ」ダイアログのコード・スタイル・ページから必要なオプションを選択することにより、JDeveloperでのアダプタ・クラスの生成方法を制御できます。標準イベント・アダプタは、宣言されたスコープ内のすべての変数にアクセスできる匿名アダプタとは異なり、パブリックまたはパッケージ・レベルでしかアクセスできません。
例18-7に示すコードは、アクションが実行されたイベント用に、標準クラスを使用して生成されたものです。
例18-7 標準クラスを使用してactionPerformedイベントに対して生成したコード
// Registers the adapter as a listener to button1. button1.addActionListener(new Frame1_button1_actionAdapter(this)); ... // Adapter class definition. class Frame1_button1_actionAdapter extends java.awt.event.ActionAdapter { Frame 1 adaptee; Frame1_button1_actionAdapter(Frame1 adaptee) { this.adaptee = adaptee; } public voidactionPerformed(ActionEvent e) { adaptee.button1_actionPerformed(e); } } void button1_actionPerformed(ActionEvent e) { // code to respond to event goes here }
例18-6では、匿名の内部クラスを使用してコードが生成されました。例18-7に示すコードは、アクションが実行されたイベント用に、標準クラスを使用して生成されたものです。アダプタを使用する方法では、どちらもアクションが実行されたイベントを処理するコードが生成されますが、匿名アダプタを使用した方がより簡潔になります。
標準アダプタをプロジェクトのデフォルトにするには、次のようにします。
メイン・メニューから、「ツール」→「プリファレンス」を選択します。
「Javaビジュアル・エディタ」ノードを選択します。
「イベント設定」グループで、イベント処理オプションとして「標準アダプタ」を選択します。
「OK」を選択します。
これで、JDeveloperではイベント用に(匿名の内部クラスではなく)標準アダプタが生成されます。
再利用するBeanを作成する場合、そのイベントを定義する必要があります。イベントの定義後、イベント処理アダプタを選択する必要があります。
標準アダプタをプロジェクトのデフォルトにするには、次のようにします。
メイン・メニューから、「ツール」→「プリファレンス」を選択します。
「設定」ダイアログで、「Javaビジュアル・エディタ」ノードを選択します。
「Javaビジュアル・エディタ」ページの「イベント設定」で、イベント処理オプションとして「標準アダプタ」を選択します。
「OK」をクリックします。
これで、JDeveloperはイベントの(匿名クラス、内部クラスではなく)標準アダプタを生成します。
JDeveloperには、カスタム・イベントのセットを作成し、そのイベントをサポートするEventListenerインタフェースとEventObjectクラスを作成する機能があります。
イベント・セットを作成するには、次のようにします。
アプリケーション・ナビゲータで、Beanを追加するプロジェクトを選択します。
メイン・メニューから、「ファイル」→「新規」を選択するか、右クリックして「新規」を選択します。
新規ギャラリの「カテゴリ」ツリーで、「一般」を開き、「Java」を選択します。
「項目」リストで、「イベント・セット」をダブルクリックします。
「イベント・セットの作成」ダイアログの「名前」フィールドで、イベント・セットの名前を入力します。
作成、編集または削除するイベントを「通知」フィールドに指定します。
「OK」をクリックすると、新規イベント・セット・クラスがプロジェクトに追加されます。
複雑なBeanのために、JDeveloperにはカスタマイザを作成するオプションがあります。カスタマイザを使用すると、必要に応じてアプリケーション・ビルダーでBeanの外観と動作を変更できます。Beanの構成可能な属性を表すには、プロパティのみでは不十分な場合があります。カスタマイザは、Beanを変更するために高度な指示が必要になる場合や、プロパティ・エディタの機能が限定されているためにBeanを十分にカスタマイズできない場合に使用されます。
単純なカスタマイザで、コンポーネント全体を一度に編集できます。通常、単純なカスタマイザでは、ユーザーが同じ手順で複数のプロパティを設定できるダイアログ・ボックスまたはパネルが表示されます。
複雑なカスタマイザは、コンポーネント・ユーザーに対話型のインタフェースを提供して、コンポーネントをカスタマイズする手順をガイドします。
複雑なカスタマイザでは、コンポーネントのカスタマイズ方法をユーザーに質問するウィザードを作成できます。ユーザーの回答に基づいて、カスタマイザでは、影響を受けるコンポーネントのプロパティがすべて編集されます。カスタマイザがJDeveloperに動作を通知するイベントを生成すると、JDeveloperでは適切なコードが生成されます。
カスタマイザを作成する手順は、次のとおりです。
アプリケーション・ナビゲータで、Beanを追加するプロジェクトを選択します。
メイン・メニューから、「ファイル」→「新規」を選択するか、右クリックして「新規」を選択します。
新規ギャラリの「カテゴリ」ツリーで、「一般」を開き、「Java」を選択します。
「項目」リストで、「カスタマイザ」をダブルクリックします。
カスタマイザの作成ダイアログの「名前」フィールドで、カスタマイザの名前を入力します。
プロジェクトのデフォルト・パッケージ以外のパッケージにカスタマイザを追加する必要がある場合は、「パッケージ」フィールドにパッケージ名を入力するか、「パッケージを参照」をクリックします。
カスタマイザでデフォルト以外のクラスを拡張する場合は、「拡張」フィールドにクラス名を入力するか、「クラスの参照」をクリックします。
「OK」をクリックして、新規カスタマイザ・クラスをプロジェクトに追加します。
Beanを開発する場合、Beanで生成する必要があるすべてのイベントについて考慮する必要があります。
コンポーネントをイベントが起動できるようにするには、次のようにします。
どのような種類のイベントを起動する必要があるかを決定し、次のどちらかを実行します。
該当する既存のイベント・セットをAWTまたはJFCから選択します。または、
新規イベント・セットを作成します。
コンポーネント用のイベント登録メソッドを作成します。
イベントに対するイベント通知/伝播のメカニズムを作成します。fire
<yourEventName
>Event()
起動されたイベントを、Bean内でイベント送信を必要とする主要なポイントからコールし、イベント通知メカニズムをコールします。
リファクタとは、プログラムの動作を変更することなくコード構造を変更する編集上の技術です。リファクタ操作は一連の簡単な編集で、プログラムのコードを最終的に動作変更を伴わずに変換します。各リファクタ操作の後、プログラムは正常にコンパイルおよび実行されます。JDeveloperには、自動リファクタ操作のコレクションが用意されています。
リファクタは、プログラムのソース・コードを変更して保持、拡張または再利用しやすくする際に使用します。この変更は一連のリファクタ・ステップとして行われます。ユーザーは、ステップの終了ごとに、プログラムを再ビルドおよび再検証して、エラーが発生していないか確認できます。
簡単なリファクタ操作の例を次にいくつか示します。
メソッドの名前の変更。この操作では、ターゲット・メソッドの使用方法を検索してから、名前の各オカレンスを置き換えるかどうかを選択できます。
クラスの複製。クラスの定義が複製され、複製された定義に含まれるクラス名のオカレンスがすべて新しい名前で置き換えられます。
メソッドへのパラメータの導入。メソッド定義がパラメータの追加によって変更され、各メソッド・コールが変更されて、該当するタイプおよび値の引数が提供されます。
また、JDeveloperには、次のようなさらに高度なリファクタ操作も用意されています。
選択クラス・メンバーからメンバー宣言を導出することによって、クラスからインタフェースを抽出します。
メンバー定義をクラス間で移動することによって、クラス・メンバーをスーパークラスにプル・アップまたはサブクラスにプッシュ・ダウンします。
クラスを抽出し、一連のフィールドまたはメソッドを新しいコンテナ・オブジェクトで置き換えます。
選択式で構成された新規要素への参照で選択した式を置き換えることによってフィールド、変数、パラメータまたは定数を導入します。
文で構成された新規メソッドへのコールで、強調表示された連続する文を置き換えることによって、メソッドを抽出します。
メソッド・オブジェクトを抽出して既存のコード・ブロックから新規のメソッドを作成し(「メソッドの抽出」と類似)、ただしそれを新規作成した内部クラス内に移動して、すべてのローカル変数をクラスのフィールドに変換します。
パラメータ・オブジェクトを導入し、一連のフィールドまたはメソッドを新しいコンテナ・オブジェクトで置き換えます。
リファクタ操作の結果が目的と異なる場合は、編集操作で行うように、[Ctrl]を押しながら[Z]
キーを押してリファクタ操作を元に戻すことができます。
ダイアグラムでインプレース編集機能を使用してクラスの名前を変更またはクラスを移動すると、そのクラスのソース・コードが自動的にリファクタされます。ダイアグラムでJavaパッケージの名前を変更またはパッケージを移動すると、そのパッケージの内容が自動的にリファクタされます。
ダイアグラムでフィールド、メソッドまたは内部クラスを削除すると、自動的に「安全に削除」リファクタ・パターンが適用されます。詳細は、第18.8.4項「コード要素の削除方法」を参照してください。
ダイアグラムのJavaクラス、インタフェース、列挙またはメンバーにリファクタ・パターンを適用するには、ダイアグラムで対象となるクラスまたはメンバーを選択し、「リファクタ」メニューから目的のリファクタ・パターンを選択します。このようにしてリファクタ・パターンを適用した場合、リファクタの結果をプレビューする機能を含む適切なダイアログが表示されます。詳細は、第18.8.6項「クラスおよびインタフェースのリファクタ」を参照してください。
Javaクラス図のJavaクラス、インタフェースおよび列挙では、次のリファクタ・パターンを使用できます。
名前の変更
移動(ダイアグラムで1つ選択した場合にも複数選択した場合にも適用されます)
複製
インタフェースの抽出
スーパークラスの抽出
Javaクラス図のJavaフィールドおよびメソッドでは、次のリファクタ・パターンを使用できます。
名前の変更
移動
staticにする
メンバーのプル・アップ
メンバーのプッシュ・ダウン
メソッドの変更(Javaメソッドのみ)
JDeveloperには、リファクタを自動的に行う様々な操作が用意されており、コードの外部的な動作を変更することなくコードの品質を強化し、しかもその内部構造を改善できます。
リファクタ操作を開始するには、次のようにします。
ソース・エディタ・ウィンドウ、ナビゲータ・ペインまたは構造ペインでプログラム要素を選択します。
プログラム要素を右クリックします。
ポップアップ・メニューから操作を選択します。
ツールバーから「リファクタ」を選択し、ドロップダウン・リストからリファクタ操作を選択することもできます。
リファクタのポップアップ・メニューには、現在のコンテキストで使用できる操作が反映されます。これは、右クリックしたときのカーソル位置にあるソース要素によって決まります。これらの操作は、要素ごとに異なります。したがって、リファクタのポップアップ・メニューでは、JDeveloperのどこを右クリックしてメニューを表示しているかによって、表示される項目が異なります。
たとえば、次のものを右クリックしたときに異なるリファクタ操作が表示される異なるポップアップ・メニューを表示できます。
構造メニュー
メソッドの行頭
IDEにおけるメソッドの戻り型
IDEにおけるメソッドの名前
IDEにおけるメソッドのパラメータ・リストのパラメータ
リファクタ操作の結果が目的と異なる場合は、編集操作で行うように、[Ctrl]を押しながら[Z]
キーを押してリファクタ操作を元に戻すことができます。
Javaアプリケーションを開発する際に、パッケージ、クラス、インタフェース、メソッド、フィールド、パラメータまたは変数へのすべての参照および定義の名前を簡単に変更できます。必要に応じて、最初にプレビュー(置換する使用方法のリスト)を生成できます。プレビューを使用して、その他の使用方法の名前を変更する前に、選択した使用方法を調査、変更するかまたは除外します。
名前の変更操作の有効範囲は、プロジェクト内の要素の全範囲になります。プロジェクト、クラス、インタフェースおよびメンバーの各使用方法は、プロジェクト内で表示されるすべての場所で置換されます。パラメータおよび変数の名前は、定義の字句範囲でのみ変更されます。同じ名前を持つその他の要素は変更されません。
デフォルトでは、操作は、コメント(ただし、コード要素を指定するドキュメント・コメント・タグではない)および注釈を除いた、.java
ファイルに制限されます。あいまいではない使用方法が置換されます。クラスとインタフェースの使用方法の名前は、完全修飾されている場合、またはimport文で指定されている場合に置換されます。
パッケージ、型およびメンバー要素の場合、操作はコメントまたはその他のファイルにまで拡張できます。操作をコメントにまで拡張する場合は、行コメント、コメント・アウトされたコード、ドキュメント・コメントの本体および注釈で置換が行われます。操作をその他のファイルにまで拡張する場合、「設定」ダイアログのファイル・タイプ・ページでテキスト・ファイルとして指定されているタイプのプロジェクト・ファイルでもテキスト置換が行われます。コメントおよびその他のファイルでの置換は、Javaコードでの置換よりもアグレッシブに行われます。
コード要素の名前を変更するには、次のようにします。
次の2つの方法のいずれかで、名前を変更する要素を選択します。
Javaソース・エディタで、名前を選択します。
ナビゲータまたは構造ペインで、名前を選択します。
次の2つの方法のいずれかで、コマンドを起動します。
メイン・メニューまたはポップアップ・メニューから「リファクタ」→「名前の変更」を選択します。
[Ctrl]と[Alt]を押しながら[R]を押します。
「名前の変更」ダイアログが開きます。
「変更後の名前」ボックスに、新しい名前を入力します。名前は有効で、まだ使用されていない必要があります。
テキスト置換の深さを設定します。
「コメント内を検索」を選択し、操作をコメント、ドキュメント・コメントの本体および注釈にまで拡張します。
(パッケージ、タイプおよびメンバー要素のみ)「非Javaファイルの検索」を選択し、操作をプロジェクトのテキスト・ファイルのその他のタイプにまで拡張します。
名前の変更操作をコミットする前に置換される使用方法をインスペクトする場合は、「プレビュー」を選択します。
「OK」をクリックします。
「プレビュー」を選択して、変更中の使用方法をすべて回避する場合は、「プレビュー」ログ・ウィンドウからの名前変更操作を完了してください。詳細は、第18.8.3項「コード要素の名前の変更方法」を参照してください。
Javaアプリケーションを開発する際に、クラス、インタフェース、メソッドまたはフィールドの定義を安全に削除できます。要素が使用中の場合は、ユーザーの確認なしに定義の削除が実行されることはありません。
要素が使用中である場合は、使用方法を示すログが表示されます。このリストを使用して、使用方法をインスペクトおよび解決します。このため、削除を確認しても、残りの使用方法は未定義の参照としてコード内に残ります。
コード要素を削除するには、次のようにします。
次のいずれかの方法で、削除する要素を選択します。
Javaソース・エディタで、名前を選択します。
ナビゲータまたは構造ペインで、名前を選択します。
次のいずれかの方法でコマンドを起動します。
メイン・メニューまたはポップアップ・メニューから「リファクタ」→「安全に削除」を選択します。
[Alt]キーを押しながら[Del]キーを押します。
「安全に削除」ダイアログが表示され、プロジェクト・ファイルで使用方法が検索されます。
ダイアログが閉じた場合、要素は削除されています。検索の実行後もダイアログが開いたままの場合、要素には未解決の使用方法があります。
「使用方法の表示」をクリックし、使用方法を調査および解決します。完了後、コマンドを再起動して要素を削除します。
「無視」をクリックし、使用方法を表示しないで要素の定義を削除します。
多くの使用方法を変更する可能性があるリファクタ操作を実行する場合、手動での変更が必要な使用方法や除外が必要な使用方法を識別する場合には、使用方法のプレビューが役に立ちます。操作をコミットする前にプレビュー・ログ・ウィンドウで使用方法を表示し、これらを調査して解決し、必要に応じて操作をコミットするオプションがあります。
ログには、閉じることが可能なパッケージとJavaファイルのツリーが表示されます。各ファイルの下には、使用方法を含むコード行が表示されます。
編集ウィンドウに使用方法を表示するには、次のようにします。
ログのエントリをダブルクリックします。
リファクタ操作から使用方法を除外するには、次のようにします。
使用方法を右クリックし、「対象外」を選択します。
リファクタ操作をコミットするには、次のようにします。
使用方法に影響する編集を行った場合は、ログ・ツールバーの「リフレッシュ」アイコンをクリックし、使用方法の検索を再実行します。
ログ・ツールバーの「リファクタ実行」アイコンをクリックします。
Javaアプリケーションを開発する際に、新規クラスとインタフェースの定義、および既存のクラスの再利用が簡単にできます。
Javaアプリケーションを開発する際に、パッケージ、クラスまたはインタフェースを別のパッケージに簡単に移動できます。必要に応じて、最初にプレビュー(置換する使用方法のリスト)を生成できます。プレビューを使用して、移動を完了する前に、選択した使用方法を調査、変更するかまたは除外します。
タイプを移動する場合、プライマリ・クラスおよびプライマリ・インタフェース(ファイルと同じ名前を持つもの)のみが移動対象として選択できます。実際には、ファイルの名前が変更され、セカンダリ・クラスおよびセカンダリ・インタフェースの定義はプライマリとともに残ります。アクセス・レベルは保持されます。元のパッケージの他のクラスが移動対象のクラスを参照している場合、移動対象のクラスにはpublicアクセス権が付与されます。移動対象のクラスが元のパッケージの他のクラスを参照している場合は、元のパッケージの他のクラスがpublicになります。
クラスまたはインタフェースを移動する操作の範囲は、プロジェクト全体です。
デフォルトでは、操作は、コメント(ただし、コード要素を指定するドキュメント・コメント・タグではない)および注釈を除いた、.java
ファイルに制限されます。あいまいではない使用方法が置換されます。完全修飾されている場合、またはimport文に指定されている場合は、使用方法が置換されます。
操作をコメントまたはその他のファイルにまで拡張することを選択できます。操作をコメントにまで拡張する場合は、行コメント、コメント・アウトされたコード、ドキュメント・コメントの本体、および注釈に含まれるテキストが置換されます。操作をその他のファイルにまで拡張する場合は、「設定」ダイアログのファイル・タイプ・ページでテキスト・ファイルとして指定されるタイプのプロジェクト・ファイルに対しても置換が行われます。コメントおよびその他のファイルでの置換は、Javaコードでの置換よりもアグレッシブに行われます。
クラスまたはインタフェースを移動するには、次のようにします。
次のいずれかの方法で、移動するパッケージ、クラスまたはインタフェースを選択します。
Javaソース・エディタで、名前を選択します。
ナビゲータまたは構造ウィンドウで、名前を選択します。
次のいずれかの方法でコマンドを起動します。
メイン・メニューまたはポップアップ・メニューから「リファクタ」→「移動」を選択します。
[Ctrl]と[Alt]を押しながら[M]を押します。
「Vehicleを移動」ダイアログが開きます。
「移動先」ボックスで、新しいパッケージ名を入力するか、「...」をクリックして既存のパッケージに移動します。
テキスト置換の深さを設定します。
「コメント内を検索」を選択し、操作をコメント、ドキュメント・コメントの本体および注釈にまで拡張します。
操作対象をプロジェクト内にある他のタイプのテキスト・ファイルにまで拡張する場合は、「テキスト・ファイルの検索」を選択します。
移動操作をコミットする前に置換される使用方法をインスペクトする場合は、「プレビュー」を選択します。
「OK」をクリックします。
「プレビュー」を選択して、変更中の使用方法をすべて回避する場合は、「プレビュー」ログ・ウィンドウからの名前変更操作を完了してください。詳細は、第18.8.3項「コード要素の名前の変更方法」を参照してください。
クラスは、アプリケーション・ナビゲータで複数のクラスを1つのパッケージから別のパッケージにドラッグして移動することもできます。
Javaアプリケーションを開発する際に、クラスまたはインタフェースを簡単に複製できます。
プライマリ・クラスおよびプライマリ・インタフェース(ファイルと同じ名前を持つもの)のみが複製対象として選択できます。複製されたクラスまたはインタフェースは、同じパッケージにオリジナルとして追加されます。
新しいクラスのメンバー名には、オリジナルでのメンバー名と同じ名前が付けられます。ただし、オリジナル・クラスやオリジナル・インタフェースの名前から導出されたメンバー名は除きます。オリジナル名がメンバー名に埋め込まれている場合は、新しい名前に置換されます。
クラスまたはインタフェースを複製するには、次のようにします。
Javaソース・エディタで、複製するクラスまたはインタフェースの名前を選択します。
注意: プライマリ・クラスおよびプライマリ・インタフェース(ファイルと同じ名前を持つもの)のみが移動対象として選択できます。 |
メイン・メニューから「リファクタ」→「複製」を選択します。
「タイプの複製」ダイアログが開きます。
「クラス名」ボックスで、新しい名前を入力します。新しいパッケージを指定することもできます。
「OK」をクリックします。
新規クラスがプロジェクトに追加されます。
Javaアプリケーションを開発する際に、既存のクラスに定義されている選択したメソッドおよびstaticフィールドから新しいインタフェースを簡単に導出できます。
オプションとして、パラメータ、変数およびメンバーのタイプ仕様などの宣言を、宣言に含まれるタイプ名を新規インタフェース名で置き換えることによって、宣言を汎化することもできます。ただし、すべての宣言を置換できるわけではありません。たとえば、メソッドの起動に使用される変数の宣言は、このメソッドが新規インタフェースに抽出されていない場合は、置換できません。置換はプロジェクト内のすべての場所で行われます。
クラスの宣言が変更され、新しいインタフェースが実装されたことが示されます。
インタフェースを抽出するには、次のようにします。
次のいずれかの方法で、インタフェースを導出するクラスを選択します。
Javaソース・エディタで、クラス名を選択します。
ナビゲータまたは構造ウィンドウで、クラス名を選択します。
メイン・メニューから、「リファクタ」→「インタフェースの抽出」を選択します。
「インタフェースの抽出」ダイアログが開きます。
「パッケージ」フィールドで、新しいインタフェースのパッケージの名前を入力します。
「インタフェース」フィールドで、新しいインタフェースの名前を入力します。
「抽出するメンバー」表で、新しいインタフェースに含めるメンバーを選択します。
クラスを指定する既存の宣言を、インタフェースを指定する宣言に変換する場合は、「使用方法の置換」を選択します。
操作をコミットする前にその使用方法をインスペクトする場合は、「プレビュー」を選択します。このオプションは、「使用方法の置換」を選択した場合にのみ有効になります。
「OK」をクリックします。
「プレビュー」を選択しない場合、インタフェースが作成され、使用方法は置換されません。
現在のクラスの選択メンバーに基づいてスーパークラスを作成できます。スーパークラスは、選択メンバーに一致するフィールド宣言とメソッド宣言から構成されます。
スーパークラスを抽出するには、次のようにします。
ナビゲータ、構造ウィンドウまたはJavaソース・エディタ・ウィンドウで、クラス名を選択します。
メイン・メニューから、「リファクタ」→「スーパークラスの抽出」を選択します。
「スーパークラスの抽出」ダイアログが開きます。
「パッケージ名」ボックスで、新しいスーパークラスが属するパッケージの名前を入力します。
「クラス名」ボックスで、新しいスーパークラスの名前を入力します。
「抽出するメンバー」表で、新しいインタフェースに含めるメンバーを選択します。
メソッドをスーパークラスのabstractメソッドとして作成する場合は、そのメソッドの「抽象」ボックスを選択します。スーパークラスにメソッドの依存性を含める場合は、「依存性」ボックスを選択します。
クラスを指定する既存の宣言を、スーパークラスを指定する宣言に変換する場合、「使用方法の置換」を選択します。
操作をコミットする前にその使用方法をインスペクトする場合は、「プレビュー」を選択します。
このオプションは、「使用方法の置換」を選択した場合にのみ有効になります。
「OK」をクリックします。
「プレビュー」を選択した場合は、プレビュー・ログ・ウィンドウからの抽出操作を完了してください。詳細は、第18.8.3項「コード要素の名前の変更方法」を参照してください。
「プレビュー」を選択しない場合、インタフェースが作成され、使用方法は置換されません。
Javaアプリケーションを開発する際に、選択したクラスの参照をスーパータイプの1つへの参照で置き換えることによって、パラメータ、変数およびメンバーのタイプ仕様などの宣言を簡単に汎化できます。ただし、すべての宣言を置換できるわけではありません。たとえば、メソッドの起動に使用される変数の宣言に対する置換は、このメソッドもスーパータイプに定義されていない場合は行われません。置換はプロジェクト内のすべての場所で行われます。
宣言を汎化するには、次のようにします。
次のいずれかの方法で、宣言を汎化するクラスまたはインタフェースを選択します。
Javaソース・エディタで、名前を選択します。
ナビゲータまたは構造ウィンドウで、名前を選択します。
メイン・メニューから「リファクタ」→「スーパータイプを可能であれば使用」を選択します。
「スーパータイプの使用」ダイアログが開きます。
「スーパータイプ」表で、宣言を汎化するスーパータイプを選択します。
操作をコミットする前にその使用方法をインスペクトする場合は、「プレビュー」を選択します。
「OK」をクリックします。
「プレビュー」を選択した場合は、「プレビュー」ログ・ウィンドウからの抽出操作を完了してください。詳細は、第18.8.3項「コード要素の名前の変更方法」を参照してください。
「プレビュー」を選択しない場合は、ただちに置換が行われます。
無名の内部クラス(匿名クラス)を名前付き内部クラスに変換できます。
匿名クラスを内部クラスに変換するには、次のようにします。
Javaソース・エディタ・ウィンドウで、匿名クラスの宣言を選択します。
メイン・メニューから、「リファクタ」→「無名を内部クラスに変換」を選択します。
「無名クラスを内部クラスに変換」ダイアログが開きます。
「クラス名」ボックスで、内部クラスの名前を入力します。
内部クラスにstatic修飾子を指定する場合は、「static」ボックスを選択します。
匿名クラスを内部クラスに変換するには、「OK」をクリックします。
Javaアプリケーションを開発する際に、メンバー定義をクラス間で簡単に移動できます。
クラス・メンバー(メソッドなど)を別のクラスに移動できます。
staticではないメソッドを移動するには、次の手順を実行します。
構造ウィンドウまたはJavaソース・エディタ・ウィンドウで、メソッド名を選択します。
メイン・メニューから、「リファクタ」→「移動」を選択します。
メンバーの移動先に適したターゲットが少なくとも1つ存在する場合は、「メンバーの移動」ダイアログが開きます。適したターゲットが存在しない場合、メッセージ・ボックスが表示されます。
「ターゲット」パネルで、メンバーの移動先のクラスを選択します。
新しい場所でメソッドおよびパラメータに新しい名前を使用する場合、「メソッド名」および「パラメータ名」ボックスに新しい名前を入力します。
移動後にメンバーの使用方法を処理する方法を選択します。
新規作成された代行メソッドを通じて使用方法を処理する場合は、「代行の使用」を選択します。
すべての使用方法を、移動後のクラス・メンバーを直接呼び出す使用方法に置き換える場合には、「置換」を選択します。
staticメソッドを移動するには、次の手順を実行します。
構造ウィンドウまたはJavaソース・エディタ・ウィンドウで、メソッド名を選択します。
メイン・メニューから、「リファクタ」→「移動」を選択します。
「メンバーの移動」ダイアログが開きます。
「ターゲット」パネルで、メンバーの移動先のクラスを入力または選択します。
移動するメンバーごとに、「抽出するメンバー」リストのメンバーの左側にあるチェック・ボックスが選択されていることを確認します。
メンバーの依存性も移動する場合、「依存性」列で対応するチェック・ボックスを選択します。
メソッドのシグネチャを変更できます。メソッドのシグネチャは、メソッドの名前とパラメータの番号およびタイプ(およびそれらの順序)の組合せです。
メソッドのシグネチャを変更するには、次のようにします。
構造ウィンドウまたはJavaソース・エディタで、メソッド名を選択します。
メイン・メニューから、「リファクタ」→「メソッドの変更」を選択します。
「メソッドの変更」ダイアログが開きます。
必要に応じて、メソッドの名前、戻り型、アクセス・レベルおよびパラメータを変更します。
メソッドの名前をすでにクラスに存在する名前に変更する場合は、次に2番目のダイアログが表示されます。このダイアログを使用して、変更するメソッドのすべての使用方法を既存のメソッドの使用方法に置換できます。
変更内容に基づいてタスクを作成し、「タスク」ウィンドウに追加する場合、「タスクをタスク・ウィンドウに追加」ボックスを選択します。
注意: この機能はコンストラクタには適用されません。 |
メソッドにstatic
修飾子を割り当てることができます。
メソッドをstaticメソッドに変更するには、次のようにします。
構造ウィンドウまたはJavaソース・エディタで、メソッド名を選択します。
メイン・メニューから、「リファクタ」→「staticにする」を選択します。
クラスがクラス階層の一部である場合、「staticにする」ダイアログが開きます。クラスがクラス階層の一部ではない場合、ただちにstatic修飾子が追加されます。
「staticにする」ダイアログが開いた場合は、次の操作を行います。
「名前」ボックスで、変更済メソッド内で参照として使用する名前を入力または選択します。
表示されるオプションはローカル・オブジェクト名から導出されます。
オーバーライドできないメソッドを作成する場合は、「finalを宣言」ボックスを選択します。
Javaアプリケーションを開発する際に、メンバーの定義をクラス(ソース・クラス)からそのスーパークラスの1つ(ターゲット・クラス)に簡単に移動できます。プロジェクト内にこのクラスの潜在的なターゲット・クラスが1つ以上存在する場合にのみ、この操作をクラスに適用できます。メンバーをライブラリ・クラスにプル・アップすることはできません。同様に、このリファクタ・コマンドは、スーパークラス句または実装されているインタフェースの一覧で宣言されているクラスにのみ適用されます。
デフォルトでは、メソッドをプル・アップすると、その定義はソース・クラスからターゲット・クラスに移動されます。メソッドを抽象化するように選択することもできます。この場合、メソッド定義はソース・クラスに残り、メソッドの宣言がターゲット・クラスに追加されます。メソッドを抽象化すると、ターゲット・クラスが未変換の場合は、ターゲット・クラスが抽象クラスに変換されます。
プル・アップ対象のメンバーには依存性がある場合があります。依存性がプル・アップ対象のメンバーの定義で使用されている場合、メンバーに依存性があります。依存性をプル・アップしないでメンバーをプル・アップすると、ターゲット・クラスに未定義の参照が発生します。プル・アップするメンバーを選択すると、そのメンバーの依存性が示されます。この場合、依存性もプル・アップするかどうかを選択できます。
privateとして宣言されたメンバーをプル・アップする場合、アクセスはprotectedに変更されます。
メンバーをプル・アップするには、次のようにします。
次のいずれかの方法で、メンバーのプル・アップ元にするクラスを選択します。
Javaソース・エディタで、名前を選択します。
ナビゲータまたは構造ウィンドウで、名前を選択します。
メイン・メニューから「リファクタ」→「メンバーのプル・アップ」を選択します。
「メンバーのプル・アップ」ダイアログが開きます。
「ターゲット」ドロップダウン・メニューからターゲット・クラスとなるスーパークラスを選択します。
「抽出するメンバー」表で、プル・アップするメンバーを選択します。
存在する場合、選択したメンバーに依存性があるメンバーが示されます。
メソッドをターゲット・クラスに抽象化する場合、「抽象」列のチェック・ボックスを選択します。
注意: 抽象化されるメンバーには依存性はありません。 |
メンバーのすべての依存性もプル・アップする場合は、「依存性」列のチェック・ボックスを選択します。
この選択によって依存オブジェクトが生成されます。すなわち、依存性の依存性もプル・アップされます。
「OK」をクリックします。
Javaアプリケーションを開発する際に、メンバーの定義をクラス(ソース・クラス)から直下のサブクラス(ターゲット・クラス)に簡単に移動できます。
デフォルトでは、メソッドをプッシュ・ダウンすると、メソッドの定義はソース・クラスからターゲット・クラスに移動します。メソッドの宣言をソース・クラスに残し、ソース・クラスが未変換の場合は、ソース・クラスを抽象クラスに変換するように選択することもできます。
プッシュ・ダウン対象のメンバーには依存性がある場合があります。メンバーがプッシュ・ダウン対象のメンバーの定義を使用している場合、このメンバーには依存性があります。依存性をプッシュ・ダウンしないでメンバーをプッシュ・ダウンすると、ソース・クラスに未定義の参照が発生します。プッシュ・ダウンするメンバーを選択すると、その依存性が示されます。この場合、依存性もプッシュ・ダウンするかどうかを選択できます。
メンバーをプッシュ・ダウンするには、次のようにします。
次のいずれかの方法で、メンバーのプル・アップ元にするクラスを選択します。
Javaソース・エディタで、名前を選択します。
ナビゲータまたは構造ウィンドウで、名前を選択します。
メイン・メニューから「リファクタ」→「メンバーのプッシュ・ダウン」を選択します。
「メンバーのプッシュ・ダウン」ダイアログが開きます。
「抽出するメンバー」表で、プッシュ・ダウンするメンバーを選択します。
存在する場合、選択したメンバーに依存性があるメンバーが示されます。
メンバーの抽象定義をソース・クラスに残す場合は、「抽象」列でのチェック・ボックスを選択します。
この選択によって依存オブジェクトが生成されます。すなわち、依存性の依存性もプッシュ・ダウンされます。
「OK」をクリックします。
Javaアプリケーションを開発する際に、式を名前付き要素に簡単に変換できます。
メソッド本体をコール元の本体に取り込み、元のメソッドを削除できます。これは、メソッド・コールのインライン化と呼ばれます。
メソッド・コールをインライン化するには、次のようにします。
Javaソース・エディタで、インライン化するメソッド・コールのインスタンスを選択します。
メイン・メニューから「リファクタ」→「インライン」を選択します。
このクラスのメソッドに対するコールが1つのみである場合は、ただちに変更が行われます。
このクラスのメソッドに対するコールが複数ある場合は、「インライン」ダイアログが開きます。
「インライン」ダイアログが開いた場合は、次のようにします。
選択したコールのインスタンスのみをインライン化するか、コールのすべてのインスタンスをインライン化するかを選択します。
「OK」をクリックします。
Javaアプリケーションを開発する際に、式をフィールドの参照に簡単に変換できます。新しいフィールド宣言がクラスに追加され、選択した式によって初期化されます。元の式は、新しいフィールドの参照と置き換えられます。
式のタイプがvoid
である場合、式をフィールドに変換することはできません。
フィールドを導入するには、次のようにします。
ソース・エディタで、式を選択します。
メイン・メニューから「リファクタ」→「フィールドの導入」を選択します。
「フィールドの導入」ダイアログが開きます。
「タイプ」ドロップダウン・メニューからフィールドのタイプを選択します。
メニューには、この式に一致するタイプがすべて表示されます。有効なタイプが1つのみの場合、このオプションは表示されません。
「名前」テキスト・ボックスには、名前が表示されます。
表示された名前を変更または置換したり、ドロップダウン・メニューから別の名前を選択できます。
初期化方法を選択します。
「現在のメソッド」を選択し、式を含む文の直前にフィールドの代入文を配置します。
「フィールド宣言」を選択し、宣言文でフィールドに値を割り当てます。式にローカル・スコープの変数またはパラメータがある場合、このオプションは無効になります。
「コンストラクタ」を選択し、クラスのコンストラクタ・メソッドでフィールドに値を割り当てます。式にローカル・スコープの変数またはパラメータがある場合、このオプションは無効になります。
「OK」をクリックします。
Javaアプリケーションを開発する際に、式を変数の参照に簡単に変換できます。新しい変数宣言がメソッドに追加され、選択した式によって初期化されます。元の式は新しいメンバーの参照と置き換えられます。
式のタイプがvoid
である場合、この式をメンバーに変換することはできません。
メンバーを導入するには、次のようにします。
ソース・エディタで、式を選択します。
メイン・メニューから「リファクタ」→「変数の導入」を選択します。
「変数の導入」ダイアログが開きます。
「タイプ」ドロップダウン・メニューからフィールドのタイプを選択します。
メニューには、この式に一致するタイプがすべて表示されます。有効なタイプが1つのみの場合、このオプションは表示されません。
「名前」テキスト・ボックスには、名前が表示されます。
表示された名前を変更または置換したり、ドロップダウン・メニューから別の名前を選択できます。
変数の宣言にfinal修飾子を追加する場合は、「finalを宣言」を選択します。
「OK」をクリックします。
Javaアプリケーションを開発する際に、メソッド本体の定数式をメソッドの新しいパラメータに簡単に変換できます。式は新しいパラメータの名前に置き換えられ、新しいパラメータがメソッドのパラメータ・リストに追加されます。また、すべてのメソッドの起動で、この式は追加引数として挿入されます。
リテラルまたはリテラルの操作が存在する場合にのみ、式をパラメータとして導入できます。
この操作は、インタフェースを実装するメソッドに対しては禁止されています。このようなメソッドのシグネチャを変更すると、実装が無効化されます。
パラメータを導入するには、次のようにします。
ソース・エディタで、式を選択します。
メイン・メニューから「リファクタ」→「パラメータの導入」を選択します。
「パラメータの導入」ダイアログが開きます。
「タイプ」ドロップダウン・メニューからフィールドのタイプを選択します。
メニューには、この式に一致するタイプがすべて表示されます。有効なタイプが1つのみの場合、このオプションは表示されません。
「名前」テキスト・ボックスに名前が表示されます。
表示された名前を変更または置換したり、ドロップダウン・メニューから別の名前を選択できます。
変数の宣言にfinal修飾子を追加する場合は、「finalを宣言」を選択します。
「OK」をクリックします。
Javaアプリケーションを開発する際に、定数式を定数参照に簡単に変換できます。定数式によって初期化された新しい定数宣言がクラスに追加され、元の定数式は定数の名前によって置き換えられます。
リテラルまたはリテラルの操作が存在する場合にのみ、式を定数として導入できます。
定数を導入するには、次のようにします。
ソース・エディタで、式を選択します。
メイン・メニューから「リファクタ」→「定数の導入」を選択します。
「定数の導入」ダイアログが開きます。
「タイプ」ドロップダウン・メニューからフィールドのタイプを選択します。
メニューには、この式に一致するタイプがすべて表示されます。有効なタイプが1つのみの場合、このオプションは表示されません。
「名前」テキスト・ボックスに名前が表示されます。
表示された名前を変更または置換したり、ドロップダウン・メニューから別の名前を選択できます。
「OK」をクリックします。
Javaアプリケーションを開発する際に、メソッドの本体の一部を抽出して別のメソッドを簡単に作成できます。抽出したコードは、元のメソッドで新しいメソッドへのコールに置き換えられます。抽出したコードで使用されていたローカル変数およびパラメータは、新しいメソッドのパラメータになります。抽出したコードの文によって行われる割当てが存在する場合は、元のメンバーで新しいメソッドへのコール値を使用する割当てに変換されます。
抽出を行うには、コードが次の制限を満たす必要があります。
単一の完全な式または一連の完全な文で構成されていること。
選択したコードの外部に宣言がある、複数の変数に割り当てることができないこと。
複数の終了ポイントを使用できないこと。終了ポイントとは、選択したコードで捕捉されない例外をスローする文、選択したコードの外部のループのbreak
またはcontinue
文、またはreturn文です。
新しいメソッドは、元のメソッドと同じクラスに追加されます。新しいメソッドは、private
として宣言されます。
注意: 選択したコード・ブロックのみが、抽出されたメソッドによって置換されます。その他の同じコード・ブロックは置換されません。 |
メソッドを抽出するには、次のようにします。
ソース・エディタで、抽出する式または一連の式を選択します。
メイン・メニューから、「リファクタ」→「メソッドの抽出」を選択します。
「メソッドの抽出」ダイアログが開きます。
新しいメソッドの名前を入力します。
「パラメータ」リストで、選択したコードに表示されるローカル変数およびパラメータに対して行う置換を指定します。
「名前」列には、元の名前と似ているか同じ置換名が表示されます。これらの名前を選択して変更できます。
「対象」列で、新しいメソッドのパラメータとなる提案パラメータを選択します。選択しないパラメータは、新しいメソッドでは初期化されていないローカル変数になります。
「上へ」ボタンと「下へ」ボタンを使用してパラメータを並べ替えます。
新しいメソッドをstaticとして宣言する場合は、「static」を選択します。
メソッドがstaticメソッドからコールされるためにメソッドが強制的にstaticに設定されている場合、またはstatic以外のメンバーを使用するためにメソッドがstatic以外に強制的に設定されている場合は、このオプションは無効です。
「OK」をクリックします。
新しいメソッドはクラスに追加され、選択したコードは新しいメソッドへのコールによって置き換えられます。
「パラメータ」リスト内の提案パラメータを選択しない場合は、新しいメソッドを編集してローカル変数を初期化します。
コンストラクタをファクトリ・メソッドに変換できます。
コンストラクタをファクトリ・メソッドに変換するには、次のようにします。
構造ウィンドウまたはJavaソース・エディタで、コンストラクタ名を選択します。
メイン・メニューから、「リファクタ」→「コンストラクタをファクトリ・メソッドと置換」を選択します。
「コンストラクタをファクトリ・メソッドと置換」ダイアログが開きます。
「メソッド名」ボックスで、新しいメソッドの名前を入力します。
ボックスには、現在のクラス名に基づいて提案された名前がすでに表示されています。
コンストラクタをファクトリ・メソッドに変換するには、「OK」をクリックします。
publicアクセス可能なクラスのフィールドを、クラス内からのみアクセス可能に変更できます。
フィールドをカプセル化するには、次のようにします。
構造ウィンドウまたはJavaソース・エディタでフィールド名(またはその親クラス)を選択します。
メイン・メニューから、「リファクタ」→「フィールドのカプセル化」を選択します。
「フィールドのカプセル化」ダイアログが開きます。
「フィールド」表で、カプセル化する各フィールドの隣にあるボックスを選択します。
このダイアログでは、メソッドまたはフィールドのアクセス・レベルおよび置換の有効範囲のオプションを指定することもできます。
カプセル化の一部としてアクセッサを置換する方法を選択します。
変更内容に基づいてタスクを作成し、「タスク」ウィンドウに追加する場合、「タスクをタスク・ウィンドウに追加」ボックスを選択します。
操作をコミットする前に変更をインスペクトする場合は、「プレビュー」を選択します。
「OK」をクリックします。
「プレビュー」を選択した場合は、「プレビュー」ログ・ウィンドウからの抽出操作を完了してください。詳細は、第18.8.3項「コード要素の名前の変更方法」を参照してください。
Javaアプリケーションの開発中に、ブールのフィールド、パラメータまたはローカル変数を選択し、反対の値で初期化できます。JDeveloperは自動的にすべての参照を修正し、同じコード機能を維持します。JDeveloperがすべてのフィールド、パラメータ、ローカル変数を参照し、すべての使用方法を反転します。このリファクタによって、ブールのメソッドまたは変数の意味が反転します。true
に評価されるブール式はfalse
になります。同様に、false
に評価されるブール式はtrue
になります。
たとえば、有効になっている変数があり、その意味を反転する場合には、「ブールの反転」メニューの選択によって、使用方法を無効にします。
ブールを反転するには、次のようにします。
ソース・エディタで、ブール式を選択します。
式を右クリックし、「リファクタ」→「ブールの反転」を選択します。
表18-1は、反転したブール式の例を示しています。
JDeveloperでは、Javaコードの品質およびパフォーマンスを分析するためのツールが提供されています。これらのツールを使用すると、コードの品質とプログラミング・スキルの両方が向上します。JDeveloperの監査機能を使用すると、Javaコードがプログラミング規格に準拠しているかどうかを分析できます。
監査とは、プログラミング規格を定義している規則およびメトリックに準拠しているかどうかについてのコードの静的な分析のことです。コード監査では、コードの改善および保守を困難にしている不具合が検出されます。JDeveloperのコード監査ツールを使用すると、このような不具合を検出および修正できます。コンパイルが不可能または実行不可能な場合でも、コードの監査は可能です。
規則とは、ある機能の有無に関する定性試験のことです。たとえば、Javaコーディングの共通のスタイルとして、クラス名を大文字にする必要があります。規則に準拠していない場合は、違反が発生します。
コード測定は、サイズまたは複雑さの定量測定です。たとえば、メソッドのサイズが大きすぎたり、メソッドで扱うケースの数が多すぎる場合、その機能の一部を別のメソッドに委譲する必要があります。指定の上限を超えると、しきい値超過異常が発生します。
プロファイルを作成してカスタマイズし、使用する規則を選択して個々の規則のパラメータを設定できます。詳細は、それぞれのコード監査規則およびコード測定を参照してください。詳細は、第18.9.25項「コード監査規則、コード・アシストおよびコード測定の参照方法」を参照してください。
Developerのコード監査機能とコード測定機能は拡張可能です。コード監査およびコード測定は、それぞれカスタマイズおよび拡張可能なソース・コード分析および変換フレームワークのある2つの側面です。コード監査およびコード測定用のパブリックAPIは、oracle.jdeveloper.audit
パッケージです。
Javaコードを監査するには、次のようにします。
監査ツールをソース・ファイルに対して実行し、コード監査レポートを生成します。詳細は、第18.9.6項「コード監査レポート生成のためにコード監査を実行する方法」を参照してください。
編集中にコード監査を行う場合は、コード・アシストを使用します。コード監査違反は編集時にハイライト表示され、自動修正を適用できます。
コマンドラインからコード監査を実行して、コード監査レポートを生成します。詳細は次の項を参照してください。
ステータス・ウィンドウには、アクティブなビューで選択したドキュメントで発生したコード監査違反が表示されます。
コード監査レポートには、ルール違反および測定結果がツリーに編成されて表示されます。ツリーの各行は構成メンバーまたは違反のいずれかに対応しており、その構成メンバーまたは理論上の違反に対するすべての測定値が含まれます。構成メンバーは、メソッド、クラス、ファイル、プロジェクトまたはワークスペースです。
規則には、次のプロパティがあります。
デフォルト修正
この規則の違反に対する修正が使用されるのは、「デフォルトの修正を適用」が構成メンバーに適用されている場合です。
パターン
規則と異なる識別子を検出するフィルタとして使用される正規表現です。
重大度
コード監査レポートで規則違反をソートする場合に使用します。
可視性
アクセス・レベルのキーワードに基づくしきい値です。違反は、可視性が選択されているクラスまたはメソッドで発生した場合にのみ報告されます。
コード監査規則は、静的かつ定性的なコード分析です。
コード監査プロファイルで、プロパティの設定によって個別の規則を有効にしたり、構成できます。コード構成メンバーが規則に従っていない場合、規則違反が報告されます。一部の規則には自動修正が定義されており、ユーザーが適用を選択できます。
監査のコード測定は、静的かつ量的なコード分析です。
コード監査プロファイルで、個別のコード測定を有効にしたり、構成できます。コード測定は、しきい値を使用して設定します。コード構成メンバーがしきい値を超えると、しきい値超過の測定がコード監査レポートに報告されます。
JDeveloperでは、次のコードが測定されます。
継承ツリーの深度(DIT)
クラスの継承ツリーの深さ。通常、java.lang.ObjectのDITは1、java.lang.Objectを直接拡張したクラスのDITは2のようになります。
文の数(NOS)
Java文でのメソッド、クラスまたは他の構成メンバーのサイズ。
循環的複雑度(V(G))
メソッドのブランチの複雑さ。メソッドを含む構成メンバー(クラスやプロジェクトなど)には、そのメソッドについて測定されたうち最大の複雑度が割り当てられます。値が10を超える場合は通常、問題ありと判断されます。
監査ツールを使用すると、監査レポートを表示したり、規則違反やしきい値を超える測定結果を調査および修正できます。コード監査が開始されると、ログ・ウィンドウに新しいタブが作成され、このタブにコード監査レポートが表示されます。
監査とは、プログラミング規格を定義している規則およびメトリックに準拠しているかどうかについてのコードの静的な分析のことです。コード監査では、コードの改善および保守を困難にしている不具合が検出されます。JDeveloperの監査ツールを使用すると、このような不具合を検出および修正できます。コンパイルが不可能または実行不可能な場合でも、コードの監査は可能です。
コード監査レポートとは、構成に編成されたツリーとして表示される規則違反およびコード測定結果のセットのことです。構成には、メソッド、クラス、パッケージ、ファイル、プロジェクトまたはワークスペースがあります。監査プロファイルに規則が含まれている場合、表には「重大度」列が含まれ、指定した構成の重大度が表示されます。監査プロファイルにメトリックが含まれている場合、表にはメトリックごとに列が追加され、構成の測定結果が表示されます。
列のコンテンツを基にレポートをソートするには、列ヘッダーをクリックします。ソート順序を逆にするには、再度クリックします。
「ログ」ウィンドウのツールバーから、表18-3に示した操作を実行できます。
表18-3 「コード監査」ウィンドウのツールバー・アイコン
アイコン | 名前 | 説明 |
---|---|---|
|
リフレッシュ |
同じプロファイルを使用して同じ選択項目に対してコード監査を再実行する場合にクリックします。 |
|
取消 |
実行中の監査を中断する場合にクリックします。結果の一部が表示される場合があります。 |
|
エクスポート |
レポートをファイルに保存できる「結果のエクスポート」ダイアログを開く場合にクリックします。結果は、XML、HTMLまたはプレーン・テキストで保存できます。 |
|
すべて展開 |
レポート内のすべてのコンテナ・ノードを展開し、すべての行を表示する場合にクリックします。 |
|
すべて閉じる |
レポート内のすべてのコンテナ・ノードを閉じ、トップレベルの構成以外のすべてを非表示にする場合にクリックします。 |
|
構成をグループ化 |
表示するコンテナ構成のタイプを指定できる「グループ化」ダイアログを開く場合にクリックします。構成別にグループ化すると、結果の適切な編成、不具合および違反の迅速な追跡、結果を簡単に分析できます。 |
|
修正 |
ドロップダウン・メニューから規則違反に対する修正を選択します。個々の規則違反に対して、その違反タイプに定義されている修正から選択します。グループ構成には、「デフォルトの修正を適用」のみを選択できます。これにより、そのタイプに定義されているデフォルトの修正(存在する場合)が適用されます。 |
|
しきい値を超えるもののみ表示 |
許容範囲内にある測定結果の表示を切り替えます。しきい値は、コード測定の設定可能なプロパティの1つです。 |
違反が表示されているJavaクラスのセットを削除する場合はフィルタを指定します。パッケージ名、クラス名またはその両方を基準にしてフィルタできます。フィルタは、カンマで区切られた1つ以上のパターンで構成されます。
パターンには、次の特殊文字を含めることができます。
*は、任意の数の文字に一致します。
?は、任意の1文字に一致します。
!がパターンの先頭にある場合は、除外パターンを示します。
フィルタを渡すクラスのセットは、パターンの順序を考慮して決定されます。非除外パターンでは、パターンに一致するすべてのクラスがセットに追加され、除外パターンでは、パターンに一致するすべてのクラスがセットから削除されます。表18-4は、指定できるフィルタを示しています。
1つ以上の構成(コンテナ・ノード)または規則違反(リーフ・ノード)を選択し、右クリックしてポップアップ・メニューを開きます。ポップアップ・メニューから、選択した構成または規則違反に対して、表18-5に示す操作を実行できます。
表18-5 「コード監査」ウィンドウのポップアップ・メニュー項目
名前 | 説明 |
---|---|
デフォルトの修正を適用 |
選択した各規則違反または選択した構成内のすべての違反にデフォルトの修正(存在する場合)を適用する場合に選択します。デフォルトの修正は、「ツール」→「プリファレンス」→「コード監査: プロファイル」ページを使用して定義できます。 |
<修正>の適用 |
構成内の選択した規則違反に対してこの修正を適用する場合に選択します。 |
<Rule>について |
この規則違反に対して適用される規則の説明を表示する場合に選択します。 |
<規則>違反を非表示 |
選択した規則のすべての違反をレポートから削除する場合に選択します。 |
非表示の違反を表示 |
前に非表示にしたすべての違反をリストアする場合に選択します。 |
しきい値を超えるもののみ表示 |
許容範囲内にある測定結果の表示を切り替える場合にクリックします。 |
取消 |
実行中のコード監査を終了する場合に選択します。 |
リフレッシュ |
コード監査を再実行する場合に選択します。 |
グループ化 |
表示するコンテナ構成のタイプを指定できる「グループ化」ダイアログを開く場合に選択します。 |
すべて展開 |
レポート内のすべてのコンテナ・ノードを展開し、すべての行を表示する場合にクリックします。 |
すべて閉じる |
レポート内のすべてのコンテナ・ノードを閉じ、トップレベルの構成以外のすべてを非表示にする場合にクリックします。 |
ソースに移動 |
規則違反があった位置でソース・ファイルを開く場合に選択します。必要に応じて、ファイルを編集して違反を修正できます。 |
エクスポート |
レポートをファイルに保存できる「結果をエクスポート」ダイアログを開く場合に選択します。 |
JDeveloperのコード監査ツールを使用すると、コードの改善および保守を困難にしている不具合が検出されます。コードは、コンパイルが不可能または実行不可能な場合も監査できます。監査のフォーカスは、コード監査の規則およびコード測定のセットであるプロファイルによって定義されます。
それぞれのコード監査規則およびコード測定を参照して詳細を確認できます。詳細は、第18.9.25項「コード監査規則、コード・アシストおよびコード測定の参照方法」を参照してください。
Javaコードを監査するには、次のようにします。
Javaプログラムの分析に使用する規則、コード・アシスト、コード測定を指定するコード監査プロファイルを作成します。コード監査プロファイルで、プロパティの設定によって個別の規則やメトリックを有効にしたり、構成できます。コード構成メンバーが規則に従っていない場合、規則違反が報告されます。
監査レポートを実行します。
メイン・メニューから監査のビルド....を選択します。詳細は、第18.9.6項「コード監査レポート生成のためにコード監査を実行する方法」を参照してください。
Javaコードは、ojaudit.exeを呼び出してコマンドラインから監査することもできます。ojaudit.exeはJDeveloperのインストールに付属しています。詳細は、第18.9.5項「コマンドラインからのJavaコードの監査」を参照してください。
完了した監査レポートで規則違反をインスペクトします。詳細は、第18.9.15項「コード監査レポートの違反またはコード測定結果のインスペクト方法」を参照してください。
「監査レポート」には、ルール違反および測定結果がツリーに編成されて表示されます。ツリーの各行は構成メンバーまたは違反のいずれかに対応しており、その構成メンバーまたは理論上の違反に対するすべての測定値が含まれます。構成メンバーは、メソッド、クラス、ファイル、プロジェクトまたはワークスペースです。
コード監査規則違反を、手動でソースを編集して修正できます。一部の規則違反については、自動修正を選択して修正します。詳細は、第18.9.16項「コード監査規則違反の修正方法」を参照してください。
監査を再実行する場合には、規則、コード・アシストおよびメトリックを有効化または無効化するか、またはそれらの構成を変更することによって、コード監査プロファイルを変更できます。詳細は、第18.9.22項「コード監査プロファイルの変更方法」を参照してください。
完了したコード監査レポートをXMLファイル、HTML形式またはテキスト・ファイルとして保存できます。詳細は、第18.9.14項「コード監査レポートの保存方法」を参照してください。書式設定は、/jdev//audit/stylesheets
ディレクトリ(このディレクトリはコード監査を実行するまで作成されません)のXSLスタイルシート・ファイルで定義されます。カスタム・フォーマットを作成するには、事前定義されたスタイルシート・ファイルの1つをコピーして、このディレクトリに追加します。
JDeveloperインストールに付属している<jdev_install>/jdeveloper/jdev/bin
ディレクトリ内のojaudit.exeを起動すると、コマンドラインからワークスペース、プロジェクトまたはソース・ファイルを監査できます。
形式
ojaudit option... file...
表18-6は、監査の際に使用できるパラメータを示しています。
表18-6 コマンドライン・パラメータ
パラメータ | 説明 |
---|---|
|
コード監査対象のワークスペース・ファイル( |
- |
プロジェクトが監査されていない場合に、監査するファイルのクラスパスを設定します。 |
|
レポートの文字コード。指定しない場合は、プロジェクトに指定されている文字コードが使用されます(プロジェクトの「プロジェクト・プロパティ」ダイアログのコンパイラ・ページを参照してください)。 |
|
プロファイル内の規則を無効にします。複数の値を指定するには、このオプションを繰り返します。 |
|
プロファイル内の規則を有効にします。複数の値を指定するには、このオプションを繰り返します。 |
|
監査者によって障害とみなされる問題の重大度を設定します。 |
|
デフォルトの修正をコードに適用します。このオプションを適用すると、ソース・ファイルが変更されます。 |
|
helpコマンドに関するヘルプを表示して終了します。 |
|
出力ファイルのパス名。省略時は、出力は標準出力に書き込まれます。 |
|
(必須)使用するプロファイル。JDeveloperで定義されているプロファイル(「ツール」→「プリファレンス」ダイアログの「コード監査」→「コード監査プロファイル」ページで設定)のいずれか、またはエクスポートされたコード監査プロファイル・ファイルのパス名です。 一致するプロファイルを検索するときに、大文字/小文字および空白は無視されます。 |
|
定義済プロファイル名を出力して終了します。 |
- |
ソース・ファイルであるパラメータに使用されるプロジェクト・コンテキスト。すべてのパラメータがプロジェクトまたはワークスペースの場合、このオプションは必要ありません。 |
- |
著作権メッセージを非表示にします。 |
|
プロジェクトが監査されていない場合に、監査するファイルのソースパスを設定します。 |
|
レポートに適用されるXSLTスタイルシート。この名前は、JDeveloperで定義されているスタイルシートか、またはスタイルシート・ファイルのパス名です。指定しない場合、XMLファイルで出力されます。 一致する定義済スタイルシートを検索するとき、大文字/小文字および空白は無視されます。 |
|
定義済スタイルシート名を出力して終了します。 |
|
レポートに使用されるタイトル。 |
|
レポートのタイトルを省略します。 |
|
実行メッセージをすべて表示します。 |
- |
コマンドのバージョンを表示して終了します。 |
|
ワークスペースではないパラメータに使用されるワークスペース・コンテキスト。ワークスペースが指定されていない場合、デフォルトのワークスペースが合成されます。 |
|
監査するファイルのワークスペース・コンテキストを設定します。 |
Developerでは、Javaプログラムのコード監査と、コード監査レポートの生成が可能です。
JDeveloperでJavaコードを監査するには、次のようにします。
アプリケーション・ナビゲータで、1つ以上のアプリケーション、プロジェクトまたはJavaソース・ファイルを選択します。監査コマンドは、エディタや構造ウィンドウなど、他のビューから選択して実行することもできます。
メイン・メニューから「ビルド」、「監査 - target」を選択します。
「監査 - <ファイル、プロジェクトまたはアプリケーション>」ダイアログが表示されます。
次の2つの方法のいずれかで、使用するプロファイルを選択します。
「プロファイル」ドロップダウン・メニューから使用するプロファイルを選択します。
「編集」をクリックしてプロファイルを作成または変更します。
「実行」をクリックします。
コード監査レポートがログ・ウィンドウに表示され、コード監査が開始されます。監査を停止する場合には、ログのツールバーの停止アイコンをクリックします。
オブジェクトは、java.io.Serializable
インタフェースを実装することによってシリアル化可能とマークされます。これは、バイトにフラット化し後で展開できることを示します。
バージョニングを可能にする、serialVersionUID
という識別子があります。
java.io.Serializableを実装しているがserialVersionUIDを持たないすべてのクラスにフラグを設定するコード監査を実行できます。
コード監査規則を設定するには、次のようにします。
メイン・メニューから「ツール」、「プリファレンス」、「コード監査」、「プロファイル」の順に選択します。
オブジェクトは、java.io.Serializableインタフェースを実装することによってシリアル化可能とマークされます。これは、バイトにフラット化し後で展開できることを示します。
オブジェクトのフィールドでシリアル化を無効にするには、そのオブジェクトのクラスのフィールドに、Javaのtransientキーワードでタグを設定します。クラスがシリアル化可能とマークされていても、transientとしてマークされておらずシリアル化できないフィールドを含んでいる場合、そのクラスはシリアル化できません。コード監査を実行すると、このようなシリアル化できないフィールドを検出できます。
コード監査規則を設定するには、次のようにします。
メイン・メニューから「ツール」、「プリファレンス」、「コード監査」、「プロファイル」の順に選択します。
コード監査レポートはログ・ウィンドウのタブ付きペインとして表示されます。コード監査レポートを使用すると、ルール違反およびしきい値を超えている測定結果を調べ、これを修正できます。
リフレッシュにより、同じプロファイルを使用してコード監査を再実行できます。コードを変更および修正した後でリフレッシュすることもできます。
コード監査レポートをリフレッシュするには、次のようにします。
「ログ」ウィンドウのツールバー内をクリックするか、右クリックして「リフレッシュ」を選択します。
「コード監査結果のエクスポート」ダイアログが消去され、新しいコード監査が開始されます。コード監査を停止するには、ログのツールバーをクリックします。
コード監査レポートの列を再配置して任意の編成にできます。
コード監査レポート列を編成するには、次のようにします。
列ヘッダーを、任意の位置の左または右までドラッグします。
コード監査レポート行は、ルール違反や測定結果、または違反および測定結果のグループです。レポートはツリーとして編成されます。ツリーの行は、構成メンバーまたは違反に対応しており、構成メンバーまたは理論上の違反の測定値が含まれます。構成メンバーは、メソッド、クラス、ファイル、パッケージ・ディレクトリ、プロジェクトまたはワークスペースです。
レポートに表示される構成メンバーを選択できます。
コード監査レポート行を編成するには、次のようにします。
「ログ」ウィンドウのツールバーで、「グループ化」をクリックします。
「グループ化」ダイアログが開きます。
表示する構成メンバーを選択します。
「OK」をクリックします。
コード測定レポートをソートするには、次のようにします。
列ヘッダーをクリックして、その列で行をソートします。ソート順序を逆にするには、再度クリックします。
クラス名のパターン・フィルタを使用して、フィルタと一致しないクラスの違反および測定結果を非表示にできます。
フィルタはカンマ、セミコロンまたは空白で区切られた一連のパターンです。パターンには、次の特殊文字を含めることができます。
*は、任意の数の文字に一致します。
?は、任意の1文字に一致します。
!がパターンの先頭にある場合は、除外パターンを示します。
表示されるクラスのセットは、パターンの順序を考慮して決定されます。非除外パターンは、パターンに一致するすべてのクラスをセットに追加し、除外パターンは、パターンに一致するすべてのクラスをセットから削除します。パターンはクラス名に一致します。
コード監査レポート行をフィルタするには、次のようにします。
コード監査のログ・ウィンドウの「パッケージ」ボックスで、完全修飾クラス名の最後の要素を除くすべての要素に適用される一連のパターンを入力します。このボックスは、「ファイル」フィルタを指定した場合、空白にしておくこともできます。
「ファイル」ボックスで、完全修飾クラス名の最後の要素のみに適用される一連のパターンを入力します。このボックスは、「パッケージ」フィルタを指定した場合、空白にしておくこともできます。
「適用」をクリックします。
レポートが再表示されて、選択した行のみが表示されます。
「クリア」をクリックして、テキストを「パッケージ」および「ファイル」ボックスから削除します。
コード監査レポートをXMLファイル、HTML形式またはテキスト・ファイルとして保存できます。
フォーマットは、<jdev_install
>/jdev
/< system>/audit
/stylesheets
ディレクトリのXSLスタイルシート・ファイルによって定義されます(このディレクトリはコード監査を実行するまで作成されません)。カスタム・フォーマットを作成するには、事前定義されたスタイルシート・ファイルの1つをコピーして、このディレクトリに追加します。
コード監査レポートを保存するには、次のようにします。
「ログ」ウィンドウのツールバー内をクリックするか、右クリックして「エクスポート」を選択します。
「コード監査結果のエクスポート」ダイアログが開きます。タイトル、書式およびレポートの保存先を選択して、「OK」をクリックします。
JDeveloperでは、すべてのコード監査規則違反に関するレポートが生成されます。
コード監査規則違反をインスペクトするには、次のようにします。
コード監査レポートで、表示する構成メンバーを選択します。
右クリックして「ソースへ移動」を選択するか、構成メンバーをダブルクリックします。
ソース・ファイルのエディタが開き、規則違反または測定されたコード要素の場所にカーソルが移動します。
違反または異常を右クリックし、「情報」を選択すると、違反が発生した規則の詳細を知ることができます。
コード監査規則違反を、手動でソースを編集して修正できます。一部の規則違反については、自動修正を選択して修正できます。
コード監査規則違反を手動で修正するには、次のようにします。
コード監査レポートで、規則違反(「構成」ツリー内のリーフ・ノード)を選択します。
右クリックし、「ソースへ移動」を選択します。
ソース・ファイルのエディタが開き、規則違反の場所にカーソルが移動します。
コードを編集して、違反の原因を修正します。
コード監査規則違反に自動修正を適用するには、次のようにします。
コード監査レポートで、規則違反(「構成」ツリー内のリーフ・ノード)を選択します。
右クリックし、<規則>修正の適用メニュー項目があれば選択します。
または
「ログ」ウィンドウのツールバー内をクリックし、<規則>修正の適用メニュー項目のいずれかを選択します。
構成メンバーでのすべての規則違反に自動修正を適用できます。Default Fix
プロパティがNone
以外の値に設定されている構成メンバーでは、デフォルトの修正が各規則違反に適用されます。
構成メンバーのコード監査規則違反を修正するには、次のようにします。
コード監査レポートで、構成メンバー(「構成」ツリー内のコンテナ・ノード)を選択します。
デフォルトの修正は、次の2つの方法のいずれかを使用して適用できます。
右クリックして「デフォルトの修正を適用」を選択します。
「ログ」ウィンドウのツールバー内をクリックし、デフォルトの値を適用を選択します。
コード監査レポートで特定のタイプの規則違反をすべて非表示にできます。個別の規則違反を非表示にすることはできません。
コード監査規則違反を非表示するには、次のようにします。
コード監査レポートで、規則違反(「構成」ツリー内のリーフ・ノード)を選択します。
右クリックして「<規則>違反を非表示」を選択します。
<Rule>のすべての違反がコード監査レポートから削除されます。削除された規則が親の構成メンバーのサマリーに記録されることはありません。「しきい値を超えるもののみ表示」が有効になっている場合は、空の構成メンバーは削除されます。有効になっていない場合は、違反のみが削除されます。
非表示のコード監査規則違反を復元するには、次のようにします。
コード監査レポートで右クリックして、ポップアップ・メニューを開きます。
「非表示の違反を表示」を選択します。
以前非表示にされたすべての規則違反が、コード監査レポートに復元されます。
コード測定レポートには、分析対象コードの構成メンバーに関する測定結果が表示されます。しきい値以下の結果を非表示にすると、しきい値を超えている測定結果にレポートをフォーカスできます。しきい値は、コード測定の設定可能なプロパティの1つです。
しきい値を超えている測定結果のみを表示するには、次のようにします。
「ログ」ウィンドウのツールバーで、しきい値超過のアイコンをクリックします。もう一度クリックすると、すべての測定結果が表示されます。
削除された測定が、その親となる構成メンバーのサマリーに記録されることはありません。「しきい値を超えるもののみ表示」が有効になっている場合は、空の構成メンバーは削除されます。有効になっていない場合は、違反のみが削除されます。
コード監査プロファイルでは、Javaコードの分析に使用する規則、コード・アシストおよびメトリックを指定することによって、監査対象を定義します。いくつかのプロファイルが事前定義されていますが、ユーザーが他のプロファイルを作成することもできます。規則、コード・アシストおよびメトリックを有効化または無効化するか、またはそれらの構成を変更することによって、コード監査プロファイルを変更できます。
JDeveloperの一部のプロセスと機能では、デフォルトで特定の監査プロファイルが使用されます。
「コード・アシスト」プロファイルは、ソース・エディタ、ステータス・ウィンドウ、アプリケーションの概要およびファイル・リストで使用されます。
「コンパイル中の監査」プロファイルは、「プリファレンス」ダイアログの監査ページで「コンパイル中の監査」が選択されている場合に、コンパイルの最後で使用されます。
「監査ルール」プロファイルは、「監査」コマンドの初期デフォルト設定です。ただし、「監査」ダイアログでは最後に選択されたプロファイルが記憶されるため、設定は永続的ではありません。
JDeveloperでは、Javaプログラムの分析に使用する規則、コード・アシスト、コード測定を指定できます。
監査プロファイルを作成するには、次のようにします。
メイン・メニューから「ツール」、「プリファレンス」を選択します。
「設定」ダイアログが開きます。
「監査」→プロファイル・ページを選択します。
「プロファイル」ドロップダウン・メニューからコピーするプロファイルを選択します。
新しいプロファイルを有効にするための規則、アシストおよびコード測定を選択します。詳細は、第18.9.26項「コード監査プロファイルをアクティブ化および非アクティブ化する方法」を参照してください。
必要に応じて、選択した規則、アシストおよびコード測定を構成します。詳細は、第18.9.27項「コード監査テストのプロパティ値の設定方法」を参照してください。
「別名保存」をクリックします。
新しいプロファイルの名前を入力し、「保存」をクリックします。
注意: 名前では大/小文字および空白は区別されませんが、大/小文字および空白は保持されます。新しい名前が既存の名前と大/小文字または空白のみが異なる場合は、そのことを通知する警告メッセージが表示されます。 |
新しいプロファイル名が、プリファレンスの「コード監査」→「プロファイル」ページの「プロファイル」ボックスに表示されます。
「OK」をクリックします。
Javaプログラムを分析するために作成したコード監査プロファイルを変更できます。
既存のコード監査プロファイルを変更するには、次のようにします。
メイン・メニューから、「ツール」→「プリファレンス」を選択します。
「設定」ダイアログが開きます。
「監査」→プロファイル・ページを選択します。
「プロファイル」ドロップダウン・メニューから変更するプロファイルを選択します。
新しいプロファイルを有効にするための規則、アシストおよびコード測定を選択します。詳細は、第18.9.26項「コード監査プロファイルをアクティブ化および非アクティブ化する方法」を参照してください。
必要に応じて、選択した規則、アシストおよびコード測定を構成します。詳細は、第18.9.27項「コード監査テストのプロパティ値の設定方法」を参照してください。
「OK」をクリックします。
既存のコード監査プロファイルを削除するには、次のようにします。
メイン・メニューから、「ツール」→「プリファレンス」を選択します。
「設定」ダイアログが開きます。
「監査」→プロファイル・ページを選択します。
「プロファイル」ドロップダウン・メニューから削除するプロファイルを選択します。(事前定義済のプロファイルは削除できません)。
「削除」をクリックします。
該当するプロファイルの名前が「プロファイル」ボックスから削除されます。
「OK」をクリックします。
コード監査プロファイルをインポートまたはエクスポートできます。この操作によって、たとえば、プロファイルを共有したり、ojauditおよび夜間ビルドによって使用されるチェックイン済プロファイルを管理できます。コード監査プロファイルは、XMLファイルとしてインポートまたはエクスポートされます。
コード監査プロファイルをインポートまたはエクスポートするには、次の手順を実行します。
「ツール」メニューで、「プリファレンス」を選択して「プリファレンス」ダイアログを開きます。
「プリファレンス」ダイアログで、「コード監査」→「プロファイル」ページを開きます。
「インポート」または「エクスポート」をクリックし、インポートまたはエクスポートするプロファイルを選択します。
それぞれの詳細は、監査テストを参照してください。
コード監査規則を参照するには、次のようにします。
メイン・メニューから、「ツール」→「プリファレンス」を選択します。
「設定」ダイアログが開きます。
「監査」→プロファイル・ページを選択します。
「規則」タブ、「コード・アシスト」タブ、「コード測定」タブのいずれかを選択します。
左側のパネルのリスト・ツリーで、カテゴリを選択します。
「説明」ボックスに、そのカテゴリの説明が表示されます。
カテゴリを展開し、選択したタブに従ってルール、コード・アシストまたはコード測定を選択します。
選択した項目の説明が「説明」ボックスに表示され、そのプロパティおよび設定が右側のペインに表示されます。
「OK」をクリックしてダイアログを閉じます。
コード監査プロファイルの作成または変更中に、プリファレンスの「監査」→プロファイル・ページからそのプロファイルの規則、コード・アシストおよびコード測定をアクティブ化および非アクティブ化します。
規則、コード・アシストまたはコード測定をアクティブ化または非アクティブ化するには、次のようにします。
アプリケーション・ナビゲータでプロジェクトを選択します。
「ツール」、「プリファレンス」、「コード監査」、「プロファイル」ページの順に選択します。
ダイアログで、「規則」タブ、「コード・アシスト」タブ、「コード測定」タブのいずれかを選択します。
左側のパネルのリスト・ツリーで、カテゴリを開きます。
アクティブ化または非アクティブ化するテストのチェック・ボックスをクリックします。
オプションとして、規則、コード・アシストまたはコード測定を構成します。詳細は、第18.9.27項「コード監査テストのプロパティ値の設定方法」を参照してください。
作業が終了した後、「OK」をクリックします。
カテゴリをアクティブ化または非アクティブ化するには、次のようにします。
左側のリストで、カテゴリのすべての項目をアクティブ化または非アクティブ化するには、規則のカテゴリのチェック・ボックスを選択します。[Ctrl]キーを押しながらカテゴリの任意の項目をクリックしても同じ結果になります。
プロファイラが収集するプログラムに関する統計によって、より多くの時間を消費するメソッド、最も多くコールされるメソッド、メモリーの使用状況および作成中のオブジェクトの種類を識別し、ボトルネックなどのパフォーマンスの問題をより簡単に診断できます。
プロファイラは、実行中のプログラムによるプロセッサおよびメモリーのリソースの使用状況を監視し、ログに記録します。統計が収集され、パフォーマンスの問題をより容易に診断してコードの非効率な部分を修正できます。
JDeveloperには、ローカルおよびリモート・プロファイリング用に、CPUプロファイラおよびメモリー・プロファイラという2種類のプロファイラが用意されています。
CPUプロファイラは、アプリケーションがプロセッサに及ぼす影響を分析するために使用します。CPUプロファイラを使用すると、起動、初期化、再描画およびコンパイルなどのアプリケーションの機能をテストできます。
メモリー・プロファイラは、プログラムがJavaヒープのメモリーをどのように使用するかを視覚的かつ統計的に分析するものです。
メモリー・プロファイリングには、アプリケーションのどの部分が最も多くのメモリーを使用しているかが表示されます。この他、どのオブジェクトが最も多くのメモリーを保持するかを調べることもできます。メモリー・プロファイラでは、次の3つのビューにデータが表示されます。新規のオブジェクト/ガベージ・コレクション・レポート用の「クラス」と「アロケータ」、さらにヒープ・スナップショット用の「参照」ビューです。
「クラス」ビューには、新規のオブジェクト/ガベージ・コレクション・データがJavaクラス別に編成されて表示されます。最も多いメモリーが割り当てられたクラスを検出するために使用します。
「アロケータ」ビューには、最も多くのメモリーを消費したスレッド・グループ、スレッドおよびメソッドが表示されます。
「参照」ビューには、スナップショットの時点でアプリケーション・ヒープにあったクラス、オブジェクトおよびオブジェクトへの参照が階層表示されます。
プロファイラは、「実行」メニューから起動します。コードの分析に使用するプロファイリングのモードを指定するには、「実行構成の編集」ダイアログの「プロファイラ」ページを使用します。
ダイアログでは、プログラムをローカルにプロファイリングするのか、リモートからプロファイリングするのかを指定することもできます。「実行構成の編集」ダイアログの「プロファイラ」ページで、プログラムをローカルにプロファイリングするにはプロファイラの接続パラメータを設定し、リモートからプロファイリングするには「リモート・プロファイル・パラメータ」を設定します。
アプリケーションは、ローカルまたはリモートでプロファイリングできます。ローカル・プロファイリングの場合には、「実行」メニューから「CPUプロファイル」または「メモリー・プロファイル」コマンドを選択してJDeveloper内でアプリケーションをプロファイリングするか、「実行」メニューからプロファイラのアタッチを選択してJDeveloper外部でプロファイリングします。リモート・プロファイリングの場合には、プロファイリング・セッションをリモートで実行します。プロファイラ・パラメータを指定して、または指定せずにJDeveloper外部のアプリケーションをプロファイリングします。アプリケーションのJVMは、同じホスト上とネットワーク上のどちらにあってもかまいません。
CPUおよびメモリー・プロファイラに対してオプションを構成するには、プロジェクトを右クリックして「プロジェクト・プロパティ」を選択します。「実行/デバッグ/プロファイル」→「編集」→「ツール設定」→「プロファイラ」をクリックしてオプションを設定します。
CPUプロファイラを使用して、アプリケーションのパフォーマンスの統計を収集します。CPUプロファイラを使用すると、起動、初期化、再描画およびコンパイルなどのアプリケーション機能をテストできます。
CPUプロファイラでは、「サンプリングの間隔[単位:ミリ秒]」の設定に基づいて、実行中のアプリケーションのサンプル・データを一定間隔で収集します。この設定は、CPUプロファイラのオプション・ページで変更できます。詳細は、第18.10.13項「CPUプロファイラのオプションの設定方法」を参照してください。
プロファイラには、「サンプルCPU時間」と「メソッド・コールのカウント」という2つのCPUプロファイリング・オプションがあります。「サンプルCPU時間」は、最大(または最小)の実行時間を占めるコードの領域を判断するために使用します。「メソッド・コールのカウント」では、コールされたメソッドとそのコール回数が表示されます。
注意: プロファイラで、時間サンプリングとメソッド・コールのカウントを同時に実行することはできません。メソッド・コールのカウントはCPU時間を大幅に使用し、プロファイラの結果の正確性も損なわれます。 |
メソッド・コールのカウントは、CPUのオーバーヘッドとメモリー使用量のいずれの点においても、負荷が最大となるプロファイリング形式です。これは、メソッドが開始および終了するたびに追加のCPUが使用され、ユースケース中にコールされるすべてのメソッドのデータが収集されるためです。
CPUプロファイラ・ウィンドウには、プロファイラから戻されたデータが表示されます。このウィンドウには、プロファイラの結果を表示、ソートおよび整理するオプション以外に、プロファイラのユースケースを開始、ラベル付け、比較および終了するオプションもあります。
プロファイラには、新規オブジェクト/ガベージ・コレクション・レポートと参照スナップショット(ヒープ・ダンプとも呼ばれる)という2つのメモリー・プロファイリング・ツールがあります。新規オブジェクト/ガベージ・コレクション・レポートは、アプリケーションのどの部分が最も多くメモリーを使用しているかを解明するために使用します。参照スナップショットは、大量のメモリーを消費しているオブジェクトを特定する際に使用します。これらのオプションは同時に使用できますが、メモリー・リークが検出されていないかぎり、通常はスナップショットは不要であり、特定のリークを調査している場合は、新規オブジェクト/ガベージ・コレクション・レポートをもう1つ使用する必要はありません。
メモリー・プロファイラ・ウィンドウには、プロファイラから戻されたデータが表示されます。このウィンドウには、プロファイラの結果を表示、フィルタリング、ソートおよび整理するオプション以外に、プロファイラのユースケースを開始、ラベル付け、比較および終了するオプションもあります。
プロファイラ自体が、使用中にCPUおよびメモリー・リソースを消費します。オーバーヘッドは、操作のプロファイリング・モードによって異なります。一般に、CPUサンプリング(20ミリ秒のサンプリング間隔)および参照スナップショットが最も速く、メモリー使用は最小です。
CPUメソッド・コール・カウントおよびメモリー新規オブジェクト/ガベージ・コレクション・プロファイリングはいずれも、プロファイラとプロファイリング対象の両方で、CPUおよびメモリーの負荷がはるかに高くなります。これは、これらが本質的にすべてのメソッド・コールを捕捉し、メソッドごと、コール・スタックごと、スレッド・データごとに記録するためです。
参照スナップショットの場合、プロファイラ・エージェントによるスナップショット・ファイルの書込みには、数秒しかかかりません。その他のすべての処理はアプリケーションの外部で行われるため、メモリー・スナップショットはアプリケーションのパフォーマンスにはほとんど影響を及ぼしません。
表18-7は、アプリケーションのベンチマークの実際のパフォーマンス時間を示しています。
表18-7 アプリケーションのベンチマーク時間
プロファイル・タイプ | 相対時間 | 時間(秒) | 備考 |
---|---|---|---|
プロファイリングなし |
1.0 |
720 |
|
CPUサンプル |
1.025 |
738 |
20ミリ秒のサンプリング・レート |
CPUサンプル |
1.29 |
930 |
10ミリ秒のサンプリング・レート |
メモリー新規オブジェクト/ガベージ・コレクション |
1.56 |
1125 |
|
参照スナップショット |
1.02 |
735 |
表18-8は、実行時間を短くしたときの数値を示しています。
表18-8 実行時間を短くした場合
プロファイル・タイプ | 相対時間 | 時間(秒) | 備考 |
---|---|---|---|
プロファイリングなし |
1.0 |
30.7 |
|
CPUサンプル |
1.4 |
41.8 |
20ミリ秒のサンプリング・レート |
CPUサンプル |
1.7 |
51.2 |
10ミリ秒のサンプリング・レート |
メソッド・コール・カウント |
4.6 |
141.2 |
メソッド・フィルタ使用 |
メソッド・コール・カウント |
6.6 |
201.3 |
フィルタ未使用 |
プロファイラの出力は、10ミリ秒と20ミリ秒のサンプリング間隔のどちらでも本質的に同じであるため、20ミリ秒の間隔が適しています。
2つの表は、プロファイリングのオーバーヘッドはユースケースによって大きく異なる場合があるものの、CPUサンプルおよび参照スナップショットは、他の選択肢よりも常に負荷が低いことを示しています。
JDeveloperでは、デフォルトで割り当てられている512MBのメモリーでユースケースをプロファイリングできますが、ユースケースによっては、新しいオブジェクトとG.C.のメモリー・プロファイリングに1GB以上のメモリーが必要になります。
プロファイリングの目的は、アプリケーションで、想定よりも多くのリソースを使用している部分がどこかを検出し、その部分を改善することによって、リソースの最適化を実現することです。そのプロセスでは、遅い、メモリーの使用が多すぎる、またはメモリー・リークがあると考えられる、個別のコマンド、トランザクションまたは一連のアクションを検出します。次に、その原因を調べ、パフォーマンスを改善するための変更を加えた後、変更の効果があるかどうかを確認するために再測定します。
プロファイラでは、このようなコマンド、トランザクションまたは一連のアクションをユースケースと呼びます。プロファイラは、重要なユースケースを切り離して正確に測定できるように設計されています。デフォルトでは、ユースケースを開始するまではプロファイラによる測定は行われず、ユースケースを終了すると測定は停止されます。表示されるデータは常に、特定のユースケースに関連します。
プロファイラ・タブのツールバーには現在のユースケースの状態が示され、ユースケースの開始と終了およびユースケース間のナビゲーションを制御できます。
ツールバーの左上にある「開始ユースケース」アイコンは、新規ユースケースを開始する際に使用します。その隣の「終了ユースケース」アイコンは、実行中のユースケースを終了する際に使用します。ユースケースを開始すると、「終了ユースケース」ツールバー・アイコンが有効になり、「開始ユースケース」ツールバー・アイコンが無効になります。
アクティブなユースケースを保存した場合、ユースケースはただちに終了します。「終了ユースケース」ツールバー・アイコンは無効になり、「開始ユースケース」ツールバー・アイコンは有効になります。
開始ユースケースおよび終了ユースケースのコントロールは、次の場合にはいずれも使用できません。
ユースケースが終了したが、プロファイラによってまだ処理されている場合
プロファイリング対象アプリケーションが実行を停止している場合
プロファイラが接続されていない場合
保存されているセッションを開きます。
プロファイラは、実行中のプログラムによるプロセッサおよびメモリーのリソースの使用状況を監視し、ログに記録します。統計が収集され、パフォーマンスの問題を診断してコードの非効率な部分を修正できます。
プロジェクトをプロファイリングするには、次のようにします。
CPUおよびメモリー・プロファイラのオプションを設定します。詳細は、第18.10.13項「CPUプロファイラのオプションの設定方法」と、第18.10.15.3項「メモリー・プロファイラのオプションの設定」を参照してください。
たとえば、プロファイラを使用して、アプリケーションによるCPU時間の使用方法をサンプリングしたり、メソッド・コールをカウントできます。あるいは、プロファイラによって新規オブジェクトおよびガベージ・コレクションに関するデータをレポートするか、またはヒープ・スナップショットを提供するかを指定できます。
JDeveloperでCPUプロファイラまたはメモリー・プロファイラを開始します。詳細は、第18.10.14項「CPUプロファイラの開始方法」を参照してください。
プロファイリング・セッションをリモートで実行することもできます。リモート・プロファイリング・セッションを開始すると、プロファイラは、リモート・アプリケーションに接続し、これをローカル・アプリケーションとみなしてプロファイリングします。詳細は、第18.10.16項「リモート・プロファイリング」を参照してください。
プログラムで重要なユースケースを切り分け、正確に測定します。詳細は、第18.10.7項「プロファイラ・ユースケースの理解」を参照してください。
ツールバーの左上にある「開始ユースケース」コントロールは、新規ユースケースを開始する際に使用します。その隣の「終了ユースケース」コントロールは、実行中のユースケースを終了する際に使用します。ユースケースを開始すると、「終了ユースケース」ツールバー・アイコンが有効になり、「開始ユースケース」ツールバー・アイコンが無効になります。
プロファイラから戻されるデータをインスペクトします。「プロファイラ」ウィンドウには、プロファイラの結果を表示、フィルタリング、ソートおよび整理するオプション以外に、プロファイラのユースケースを開始、ラベル付け、比較および終了するオプションもあります。
後で分析するために、プロファイリング・セッションの結果を保存することもできます。
プロファイリング・セッションが完了すると、その統計を使用してパフォーマンスの問題をより簡単に診断し、コードの非効率な部分を修正できます。
CPUプロファイラでは、アプリケーションのパフォーマンスに関する統計データが、使用時間またはコールしたメソッドの視点から要約されて表示されます。
CPUプロファイラを使用すると、次のいずれかの方法でコードをプロファイリングできます。
「サンプルCPU時間」で、最も時間を要するアプリケーションの部分を識別します。
「メソッド・コールのカウント」で、メソッドがコールされていることと、コールされた回数を確認します。
CPUプロファイリングは、Javaプラットフォームのコールを表示し、これらのメソッド・コールの回数をカウントして、アプリケーションの各メソッドの処理に要した時間を表にまとめます。CPUプロファイラでは、データが2つのビューに表示されます。「ホットスポット」と「コール・スタック」です。
「ホットスポット」ビューには、CPUプロファイラの操作の時間サンプリング・モードでの時間使用でソートされた、すべてのJavaプラットフォーム・メソッドとそのメソッドでコールされたすべてのメソッドが表示されます。また、各メソッドのCPU使用時間の累積も表示されます。メソッド・コール・カウント操作中、「ホットスポット」ビューには、すべてのメソッドおよびそれらがコールされた回数が表示されます。
「コール・スタック」ビューでは、CPUプロファイラの時間サンプリング操作モードの場合、コール階層でコールされたJavaプラットフォーム・メソッドを表示できます。メソッド・コールのカウント・モードの場合には、コールされたJavaプラットフォーム・メソッドがスレッド・グループ別にソートされて表示されます。
CPUプロファイラを時間サンプリング・モードで使用すると、プログラムが分析され、CPU時間の使用方法に関する結果が報告されます。データは「ホットスポット」と「コール・スタック」という2つのビューに表示されます。
「ホットスポット」ビューには、すべてのメソッドが、それぞれに費やされた時間の値でソートされて表示されます。各メソッドの下にある階層には、メソッドのコール元、次に、そのコール元などが表示されます。
「ホットスポット」の一番上のメソッドは単なるノイズであることが多く、イベント・ディスパッチャがタスクを完了するために使用するパスになります。「スタック・フィルタ」を使用して、適切なメソッドのみにビューを絞ることができます。または、「フィルタの編集」ダイアログを使用して、表示するメソッドを指定する検索またはフィルタ式を入力することもできます。
「コール・スタック」ビューでは、コールされたメソッドがコール階層に表示されます。これは、各層が1つ上の層にコールされることを示します。表18-9は、「コール・スタック」ビューに表示されるデータ列を示しています。
表18-9 プロファイラのデータ列
列 | 説明 |
---|---|
名前 |
完全修飾されたメソッド名を表示します。 |
CPU% |
現在選択されているデータ列のパーセンテージを表示します。たとえば、「CPU」列が選択されている場合(下向きの三角形で示されます)、この列の名前は「CPU%」となります。「CPUシャロー」列を選択した場合、列名は「CPUシャロー%」になります。 |
CPU(ミリ秒) |
各メソッドおよびコールされたすべてのメソッドでかかったCPU時間の累積が、秒単位で表示されます。 |
CPUシャロー(ミリ秒) |
各メソッドでかかったCPU時間を個別に表示します。 |
ブロック(ミリ秒) |
各メソッドでかかった累積ブロック時間および各メソッドによってコールされるすべてのメソッドを表示します。この列は、「実行構成の編集」ダイアログで「ブロック時間および待機時間の収集」チェック・ボックスが選択されている場合に表示されます。 |
ブロック・シャロー(ミリ秒) |
各メソッドでかかったブロック時間を表示します。この列は、「実行構成の編集」ダイアログで「ブロック時間および待機時間の収集」チェック・ボックスが選択されている場合に表示されます。 |
待機(ミリ秒) |
各メソッドの累積待機時間および各メソッドによってコールされるすべてのメソッドを表示します。この列は、「実行構成の編集」ダイアログで「ブロック時間および待機時間の収集」チェック・ボックスが選択されている場合に表示されます。 |
待機シャロー(ミリ秒) |
各メソッドの待機時間を表示します。この列は、「実行構成の編集」ダイアログで「ブロック時間および待機時間の収集」チェック・ボックスが選択されている場合に表示されます。 |
経過時間(ミリ秒) |
各メソッドおよびコールされたすべてのメソッドの経過時間の累積を表示します。この列は、「実行構成の編集」ダイアログで「経過時間の収集」チェック・ボックスが選択されている場合に表示されます。 |
経過シャロー(ミリ秒) |
各メソッドの経過時間を表示します。この列は、「実行構成の編集」ダイアログで「経過時間の収集」チェック・ボックスが選択されている場合に表示されます。 |
I/O(ミリ秒) |
各メソッドおよびコールされたすべてのメソッドの入力/出力時間の累積を表示します。この列は、「実行構成の編集」ダイアログで「IO時間の収集」チェック・ボックスが選択されている場合に表示されます。 |
I/Oシャロー(ミリ秒) |
各メソッドの入力/出力時間を表示します。この列は、「実行構成の編集」ダイアログで「IO時間の収集」チェック・ボックスが選択されている場合に表示されます。 |
注意: 「スタック」ビューで1つのスレッドに複数のトップレベル・メソッドが表示されている場合は、アプリケーションに対してスタック深度が浅すぎます。スタック深度を深くするには、「実行コンフィギュレーションの編集」ダイアログのCPUプロファイラのオプション・ページを更新する必要があります。 |
CPUプロファイラをメソッド・コールのカウントに使用すると、メソッドがコールされたことが確認され、その回数が報告されます。メソッド・コール・カウントは、特定のメソッドに過剰なCPU時間がかかる理由の解明に役立ちます。プロファイラのメソッド・コール・カウント・データを使用して、そのメソッドのコール元を分析し、コードを適切に編集して回数を減らすことができます。
プロファイラを使用して、アプリケーションによるCPU時間の使用方法をサンプリングしたり、メソッド・コールをカウントできます。
CPUプロファイラのオプションを設定するには、次の手順を実行します。
ナビゲータで、プロファイルを作成するプロジェクトをダブルクリックして「プロジェクト・プロパティ」ダイアログを開きます。
「実行/デバッグ/プロファイル」をクリックします。
「編集」をクリックします。
「実行構成の編集」ダイアログの「ツール設定」→「プロファイラ」→「CPU」ページで、必要に応じてオプションを設定します。
プロファイラを使用してCPU時間をサンプリングしたり、メソッド・コールをカウントするように指定できます。
終わったら、「OK」をクリックします。
CPUプロファイリング・セッションを開始すると、プログラムが自動的に実行されます。CPUプロファイラ・ウィンドウが開いた後、ユースケースを開始してアプリケーションをプロファイリングできます。
CPUプロファイラを開始するには、次の手順を実行します。
ナビゲータで、実行可能なノード、たとえばApplication1.javaを選択します。
メイン・メニューから「実行」→「CPUプロファイル project
」を選択します。
「実行構成の編集」ダイアログ(「アプリケーション」メニュー→「プロジェクト・プロパティ」→「実行/デバッグ/プロファイル」)の「起動設定」ページで、デフォルトの実行ターゲットが指定されていない場合には、「デフォルトの実行ターゲットの選択」ダイアログが開きます。このダイアログを使用して、「デフォルトの実行ターゲット」を指定します。
「開始ユースケース」アイコンをクリックして、プロファイリング・ユースケースを開始します。
注意: プロファイラの起動時にただちにアプリケーションをプロファイリングする場合は、「実行構成の編集」ダイアログの「プロファイラ」ページで、「アプリケーション起動時にユースケースを開始」チェック・ボックスを選択します。 |
メモリー・プロファイラを使用すると、プログラムがどのようにJavaヒープを使用しているかを把握できます。ヒープの非効率な使用と、メモリーに関する疑わしい動作を検出できます。
プロファイラには、メモリー・プロファイリング用のツールが2つあります。新規オブジェクト/ガベージ・コレクション(以降は新規/G.C.と表記)レポートと、参照スナップショット(ヒープ・ダンプとも呼ばれる)です。これらのツールを使用する際には、次の点に注意してください。
新規/G.C.レポートは、アプリケーションのどの部分が最も多くメモリーを使用しているかを解明するために使用します。
参照スナップショットは、大量のメモリーを消費しているオブジェクトを特定する際に使用します。
メモリー・プロファイリングおよびメソッド・コールのカウントは、システムおよびアプリケーションの処理速度を大幅に低下させます。アプリケーションのプロファイリングを開始する前に、次の情報に注意してください。
ユースケースは具体的かつ短くしておきます。
アプリケーションが起動するまで待機してからユースケースを開始します。
大規模なアプリケーションをプロファイリングする場合、JDeveloperではデフォルトを超えるメモリー・サイズが必要です。アプリケーションの処理速度が低下する場合は、<jdev_install>/jdev/binディレクトリに移動し、コマンドラインから次のコマンドを使用してJDeveloperの起動を試行します。
jdev -J-Xmx1024m
このコマンドにより、1GBの仮想メモリーがJDeveloperに割り当てられ、デフォルト・メモリーの512MBよりも優先されます。
Oracle WebLogic ServerにデプロイされたWebアプリケーションは、大規模なアプリケーションとみなされます。したがって、-J-Xmx1024m
パラメータを使用してJDeveloperを起動し、プロファイリングの開始前にメモリー・サイズを増やします。
一部の大規模なアプリケーションまたはユースケースは、Windowsでのプロファイリング時に失敗する可能性があります。こうしたアプリケーションまたはユースケースはLinuxでプロファイリングを試行します。Windowsオペレーティング・システムでは、JVMに対する連続した仮想メモリーが制限されますが、Linuxではこうした制限はありません。
メモリー・プロファイラには、新規/G.C.レポートの「クラス」ビューと「アロケータ」ビュー、およびヒープ・スナップショットの「参照」ビューという3種類のビューでデータが表示されます。
「クラス」ビューには、新規のオブジェクト/ガベージ・コレクション・データがJavaクラス別に編成されて表示されます。最も多いメモリーが割り当てられたクラスを検出するために使用します。このビューには、メモリー・プロファイラの下部にある「クラス」タブをクリックすると切り替えることができます。
「アロケータ」ビューには、最も多くのメモリーを消費したスレッド・グループ、スレッド、スタックおよびメソッドが表示されます。このビューには、メモリー・プロファイラの下部にある「クラス」タブをクリックすると切り替えることができます。
「参照」ビューには、スナップショットの時点でアプリケーション・ヒープにあったクラス、オブジェクトおよびオブジェクトへの参照が階層表示されます。
参照スナップショットは、スナップショット時のアプリケーション・ヒープ内のクラス、オブジェクトおよびオブジェクトへの参照の階層表示です。JVMガベージ・コレクション・ルートからオブジェクトへの参照およびオブジェクト間の参照という、2種類の基本的な参照があります。
JVMガベージ・コレクション・ルートには、アクティブなスレッドからの参照、JNIローカルおよびグローバル変数からの参照および内部JVM参照が含まれます。これらは、オブジェクトをメモリー内に保持する参照であり、gcルートからオブジェクトへのパスがない場合、ガベージ・コレクションに適格です。スナップショットには、1つ以上のJVM gcルートから到達可能なオブジェクトのみが含まれます。
static参照およびクラス・ローダーからの参照は、ガベージ・コレクション・ルートではありません。クラス・ローダー、クラス・ローダーによってロードされたクラスまたはこれらのクラスのオブジェクトへの他の参照がない場合、クラス・ローダーはガベージ・コレクション可能です。クラス・ローダーのガベージ・コレクションが行われるとき、クラス・ローダーによってロードされたすべてのクラス、およびこれらのクラスからstatic参照のみによって参照されるすべてのオブジェクトのガベージ・コレクションも行われます。
オブジェクト間の参照には、正常(強)参照、ソフト参照、弱い参照および疑似参照という4つのタイプがあります。メモリー・リークを検出している場合、通常は強参照のみを考慮します。強参照のみを表示するかすべての参照を表示するかを切り替えることができます。
異なるスナップショットに新しい参照と古い参照がある場合は、異なるフォント・スタイルで示されます。2つのメモリー・スナップショットを比較するとき、現在のスナップショットのメソッドは太字のフォントで表示されます。他のスナップショットにも存在するメソッドがある場合には、現在のスナップショットに太字斜体のフォントで表示されます。
参照スナップショットを比較するには複数の方法があります。メモリー・プロファイラの「参照」ビューでは、たとえば「比較対象」を選択して、現在のスナップショットから異なるユースケース(スナップショット)を選択できます。あるいは、2つのプロファイラ・タブが開いている場合(保存したプロファイル・セッションを開いた場合など)には、「比較対象」と「その他」を選択し、別のセッションからユースケースを選択します。
プロファイラを使用して、アプリケーションによるCPU時間の使用方法をサンプリングしたり、メソッド・コールをカウントできます。
メモリー・プロファイラのオプションを設定するには、次のようにします。
ナビゲータで、新規オブジェクトおよびガベージ・コレクションに関するデータをレポートする、またはヒープ・スナップショットを提供するためにプロファイリングするプロジェクトをダブルクリックします。
「実行/デバッグ/プロファイル」をクリックします。
「編集」をクリックします。
「実行構成の編集」ダイアログの「ツール設定」→「プロファイラ」→「CPU」ページで、必要に応じてオプションを設定します。
プロファイラによって新規オブジェクト/ガベージ・コレクション・データを収集するか、またはヒープ・スナップショットを取得するか、あるいはその両方かを指定できます。
終わったら、「OK」をクリックします。
プロファイリング・セッションをリモートで実行できます。リモート・プロファイリング・セッションを開始すると、プロファイラは、リモート・アプリケーションに接続し、これをローカル・アプリケーションとみなしてプロファイリングします。プロファイラをローカルで実行しているため、コンピュータにアクセス可能なIPアドレスまたはDNS名が付与されている場合は、他のコンピュータ上のアプリケーションをプロファイリングできます。
リモート・プロファイリングとローカル・プロファイリングの主な違いは、プロファイリング・セッションを開始する方法です。ローカル・プロファイリングの場合、JDeveloperによってプロファイリング対象のプログラム(プロファイリング対象プロセス)が自動的に起動され、そのプログラムにプロファイラが接続されます。リモート・プロファイリングの場合、プロファイリング対象プログラムを手動で起動し、後からプロファイラをアタッチする必要があります。プロファイリング対象プロセスが起動し、JDeveloperプロファイラがそのプロセスに接続されると、リモート・プロファイリングとローカル・プロファイリングの違いはなくなります。プロファイリング対象プロセスがJDeveloperと同じマシンで実行されているかどうかに関係なく、リモート・プロファイリングを使用できます。
注意: アプリケーションをリモートでプロファイリングする場合、プロファイラ・パラメータを指定して、または指定せずに外部アプリケーションを起動できます。プロファイラ・パラメータを指定して起動したアプリケーションのJVMは、同じホスト上(ローカル)とネットワーク上のどちらにあってもかまいません。プロファイラ・パラメータを指定せずに起動したアプリケーションのJVMは、同じホスト上にある必要があり、後でプロファイラをアタッチできます。 |
リモート・プロファイリングとローカル・プロファイリングそれぞれに利点があります。リモート・プロファイリングの場合、プロファイラおよびプロファイリング対象プロセスは2台の個別のコンピュータで実行できるため、同じリソースに対して競合しません。ただし、大量のデータをネットワークで転送すると、プロファイラのパフォーマンスが大幅に低下する場合があります。
リモートでプロファイリングする場合は、プロファイラ・エージェントを起動します。JDeveloperのプロファイラ・エージェントは、WindowsとLinuxで32ビット版および64ビット版のJVMをサポートしています。プロジェクトのJVMを指定するには、「実行構成の編集」→「起動設定」ページを使用します。
プロファイラ・エージェント・ファイルの名前は、サポート対象のアーキテクチャとJVMのサイズに基づいて決まります。
profiler_x32.dll
profiler_x32.so
profiler_x64.dll
profiler_x32.so
プロファイリング対象をJDeveloperから起動した場合、プロファイラはJDeveloper JVMのサイズを自動的に検出します。
Linuxでは、APIを使用して、リモートJVMが32ビットと64ビットどちらのアーキテクチャかを検出し、適切なエージェントを使用する必要があります。(これを一般化して他のアーキテクチャをサポートできます。)
Windowsでは、APIを使用して、リモートJVMが32ビットと64ビットどちらのアーキテクチャかを検出する必要があります。それがJDeveloperのJVMアーキテクチャと同じではない場合には、アタッチできるJVMのリストに表示しません。
ローカルにアタッチし、JDeveloperのJVMが32ビット版の場合、プロファイラは32ビット版エージェントのダウンロードを試行し、それに失敗すると64ピット版を試行します。JDeveloperのJVMが64ビット版であれば、プロファイラは64ビット版エージェントしか試行しません。
JDeveloperでプログラムのリモート・プロファイリングを実行するには、コマンドラインからJavaプロセスを開始する必要があります。コマンドラインからは、プロファイラ・エージェントを起動することもできます。プロセスの開始後は、JDeveloperプロファイラをプロファイラ・エージェントに接続できます。
プロファイラ・エージェントは、-agentlib
または-agentpath
オプションを使用して起動できます。
-agentlibオプションを使用したプロファイラ・エージェントを起動するには、次のようにします。
コマンドラインで、次の実行文字列を入力します。
java -agentlib:<Profiler-Agent-Library>=<sub-option1>[=<value1>],<sub-option2>
[=<value2>]... -classpath -classpath <Project_Directory>\classes <Java_Main_Class>
注意: -agentlibを指定する際には、.dll拡張子を除くエージェントの絶対パスを指定するか、エージェントのパスをPATH変数に追加してから絶対パスおよび拡張子なしでエージェントを指定できます。 |
例1
java -agentlib:C:\JDeveloper\jdeveloper\jdev\lib\
profiler_x32=jarpath=C:\JDeveloper\jdeveloper\jdev\lib\
profiler-agent.jar,port=4000,enable=t,startup=connect -classpath c:\MyApp\MyProject\classes MyMainClass
例2
set PATH=C:\JDeveloper\jdeveloper\jdev\lib;%PATH% java -agentlib:profiler_x64=jarpath=C:\JDeveloper\jdeveloper\jdev\lib\profiler-agent.jar,port=4000,
enable=t,startup=connect -classpath c:\MyApp\MyProject\classes MyMainClass
-agentpathオプションを使用したプロファイラ・エージェントを起動するには、次のようにします。
コマンドラインで、次の実行文字列を入力します。
java -agentpath:<Path_to_Agent_Library>=<option1>[=<value1>],<option2>[=<value2>]... -classpath <Project_Directory>\classes <Java_Main_Class>
意味は次のとおりです。
<Path_to_Agent_Library>
は、profiler_x32.dll
またはprofiler_x64.dll
のフルパスです。たとえば、<jdev_install>\jdeveloper\jdev\lib\profiler_x32.dll
となります。
注意: -agentpathを指定する際には、 |
例
-agentpath:C:\JDeveloper\jdeveloper\jdev\lib\
profiler_x32.dll=jarpath=C:\JDeveloper\jdeveloper\jdev\lib\
profiler-agent.jar,port=4000,enable=t,startup=connect,depth=1000,interval=20 -classpath c:\MyApp\MyProject\classes MyMainClass
表18-10は、-agentlib
および-agentpath
オプションで使用できるサブオプションです。
表18-10 サブオプション
サブオプション | 説明 |
---|---|
|
データの転送に使用するポートを指定します。デフォルトは4000です。 |
j |
プロファイラJARファイルのパス。このJARは、 |
|
エージェント機能を有効にします。
t、cまたはmのうちの1つのみを指定できます。rはmと組み合せたり、単独で指定できます。 |
|
起動時にユースケースを開始する場合は、次のいずれかを指定できます。
プロファイラが接続されていない場合は、ユースケースを実行できません。
|
|
コレクションに使用するスタックの深度の最大値を設定します。デフォルトは1000です。 |
i |
サンプリングの間隔(ミリ秒単位)。デフォルトは20です。このことは、CPU時間サンプリングにのみ適用されます。 |
|
待機時間およびブロック時間をレポートします。デフォルトはnです。このことは、CPU時間サンプリングにのみ適用されます。 |
|
参照スナップショット・ファイルの書込みに使用するパスを設定します。 すべてのスナップショットに同じパスが使用されるので、次のユースケースが終了する前にファイルがコピーされていることが重要です。このことは、プロファイラおよびファイル・クライアントによって自動的に行われます。 |
|
スタック・トレースに含める、または除外するクラスを指定します。次に例を示します。
この式により、レポートされるスタック・トレースには、名前が |
|
式で指定されたメソッドを含むスタックのみを収集します。次に例を示します。
この式により、スタックに |
|
メモリー・レポートに含める、または除外するオブジェクト・クラス。次に例を示します。
この式では、文字列にjava.langが含まれるクラスは表示されません。 |
コマンドラインの例
java
-agentlib:profiler_x32=port=4000,
jarpath=C:\JDeveloper\jdeveloper\jdev\lib\profiler-agent.jar,enable=t,depth=1000,startup=time,interval=20 -classpath
C:\JDeveloper\jdeveloper\mywork\Application1\Project1\classes project1.Application1
java
-agentlib:profiler_x64=port=4000,
jarpath=C:\JDeveloper\jdeveloper\jdev\lib\profiler-agent.jar,enable=m,startup=connect -classpath C:\JDeveloper\jdeveloper\mywork\Application1\Project1\classes project1.Application1
java
-agentlib:profiler_x32=port=4000,
jarpath=C:\JDeveloper\jdeveloper\jdev\lib\profiler-agent.jar,startup=connect,mem -classpath
C:\JDeveloper\jdeveloper\mywork\Application1\Project1\classes project1.Application1
java
*
-agentpath:C:\JDeveloper\jdeveloper\jdev\lib\profiler_x64.dll=
jarpath=C:\JDeveloper\jdeveloper\jdev\lib\profiler-agent.jar,port=4000,enable=t,startup=connect,depth=1000,interval=20 -classpath C:\JDeveloper\jdeveloper\mywork\Application1\Project1\classes project1.Application1
JDeveloperでプログラムのリモート・プロファイリングを実行するには、まずJavaプログラム・セッションを開始し、プロファイラ・エージェントを起動する必要があります。詳細は、第18.10.18項「プロファイラ・エージェントの起動方法」を参照してください。
セッションの開始後は、JDeveloperプロファイラをこのセッションに接続できます。プロファイラの接続には、まずリモート・プロファイリングに向けたJDeveloperの準備が必要です。
リモート・プロファイリング・セッションを設定するには、次のようにします。
アプリケーション・ナビゲータで、リモートからプロファイリングするプロジェクトを選択します。
実行構成を選択し、「編集」をクリックします。詳細は、第19.3項「プロジェクトを実行用に設定する方法」を参照してください。
「プロファイラ」ノードの「リモート」ページで、ローカルかリモートのプロセス・タイプを選択します。
終了したら「OK」をクリックします。
Javaプログラム・セッションを開始していない場合は、開始します。詳細は、第18.10.18項「プロファイラ・エージェントの起動方法」を参照してください。
リモート接続するには、次のようにします。
アプリケーション・ナビゲータで、リモートからプロファイリングするプロジェクトを選択します。
「実行」メニューから、必要に応じて「CPUプロファイル」または「メモリー・プロファイル」にプロファイラをアタッチします。
「実行中JVMへのプロファイラのアタッチ」ダイアログで、「リモート・プロセスに添付」オプションが選択されていることと、ホスト/ポート情報が正しいことを確認します。
「OK」をクリックします。
「プロファイラ」タブで、「開始ユースケース」をクリックしてユースケースのプロファイリングを開始します。
終わったら、プロファイラを連結解除します。「実行」メニューから、「連結解除」を選択します。
注意: 「実行構成の編集」ダイアログの「プロファイラ」ページにある「アプリケーション起動時に接続」と「アプリケーション起動時にユースケースを開始」のチェック・ボックスは、プロファイラをローカル・プロセスにアタッチしている場合には何の効果もありません。このチェック・ボックスが関係するのは、プロファイラをリモート・プロセスにアタッチしているときのみです。 |
JDeveloperでは、実行中のプロセスに対してプロファイラを動的にアタッチおよび連結解除できます。これは、リモート・プロファイリングにアタッチされるプロファイラに似ていますが、アプリケーションの起動時にコマンドラインでプロファイラ・パラメータを指定する必要がありません。たとえば、開始したときにはプロファイリングを予定していなかったが、後からパフォーマンス上の問題が生じるようになったためプロファイリングが必要になったアプリケーションを実行するような場合があります。このような場合には、実行中のプロセスにプロファイラを動的にアタッチすると、JVMを再起動してからプロファイラをアタッチする手間が不要になります。
プロファイラの動的なアタッチには、制限事項もあります。CPU時間サンプリングを実行することも、メモリー参照スナップショット(ヒープ・ダンプ)を作成することもできますが、メソッド・コール・カウントと新規/gcメモリー・プロファイリングは実行できません。それらにはバイトコードの実装が必要であり、これはJVMの起動より前にコマンドラインからしかリクエストできないからです。
実行中のプロセスに対してプロファイラを動的にアタッチ/連結解除するには、次のようにします。
JDeveloper外部、たとえば別のコマンド・ウィンドウでプログラムを起動します。
JDeveloperを起動して「実行中JVMへのプロファイラのアタッチ」ダイアログを開きます(「実行」→プロファイラのアタッチ→「CPUプロファイル」または「メモリー・プロファイル」)。
「実行中JVMへのプロファイラのアタッチ」ダイアログで、「ローカル・プロセスに添付」オプションを選択します。
JVMのリストから、ローカル・システムで実行されているプログラムのJVMを選択します。
「OK」をクリックします。プロファイラが実行中のJVMに接続します。
実行中のプロセスからプロファイラを連結解除するには、「実行」メニューから「連結解除」を選択します。「プロファイラ」タブを閉じることによってプロファイラを切断した場合、再アタッチすることはできません。後から再アタッチする場合には、「連結解除」コマンドを使用してください。
プロファイラをプロセスに再アタッチするには、次のようにします。
プロセスに対するプロファイラのアタッチと連結解除は何度でも行えますが、再アタッチの前に次の点に注意してください。
再アタッチの前に、プロファイラが連結解除されていることを確認してください。
プロファイラを再アタッチすると、新しいプロファイラ・セッションが開始され、以前のセッションのデータは失われます。以前のセッションのデータを保存するには、「ファイル」メニューから「別名保存」を選択してください。
プロファイラをプロセスに再アタッチするとき、構成設定を変更して新しい構成設定で再アタッチできます。たとえばCPUをプロファイリングしている場合、CPU構成を変更して収集I/O時間、CPU時間、待機時間などを有効または無効にできます。メモリーをプロファイリングしている場合、プロファイラを再アタッチしてヒープ・ダンプを取得できます。CPUプロファイリングとメモリー・プロファイリングを相互に切り替えることも可能です。
ただし、CPUプロファイリングの構成をメソッド・コール・カウントに変更した場合、あるいはメモリー・プロファイリングの構成を新規/gcに変更した場合、再アタッチはできません。アプリケーションの起動後にはプロファイラが取得できない機能を必要とするためです。これらのいずれかを実行するためには、適切なプロファイリング・パラメータを指定してアプリケーションを起動し、「リモート・プロセスに添付」コマンドを使用してプロファイラをアタッチする必要があります。
プロファイル・ポイントを使用して、メソッドまたはクラスに対するメソッド・フィルタを設定できます。つまり、それらのメソッドまたはクラスを含むスタックのみがプロファイラによってレポートされます。このフィルタは、メソッド、そのコール元およびコール先のみが表示されるように、データをフィルタリングするために使用されます。
プロファイル・ポイントを設定するには、次のようにします。
ソース・エディタでファイルを開き、実行可能なコード行の隣の左マージンを右クリックします。
ポップアップ・メニューから「プロファイル・ポイントの切替え」を選択します。プロファイル・ポイントのアイコンが親クラスまたはメソッド名の左マージンに表示されます。
プロファイル・ポイントの無効化
次のいずれかの方法で、プロファイル・ポイントを無効化できます。
ソース・エディタで、左マージンのプロファイル・ポイント記号を右クリックし、「プロファイル・ポイントの無効化」を選択します。
「プロファイル・ポイント」ウィンドウ(「表示」→「プロファイル・ポイント」)で、無効化するプロファイル・ポイントを右クリックし、「無効化」を選択します。
現在のプロファイル・ポイントをすべて無効化するには、「プロファイル・ポイント」ウィンドウで右クリックし、ポップアップ・メニューで「すべて無効化」を選択します。
プロファイル・ポイントの削除
プロファイル・ポイントでコードを確認する必要がなくなった場合は、プロファイル・ポイントを削除できます。次のいずれかの方法で、プロファイル・ポイントを削除できます。
ソース・エディタで、左マージンのプロファイル・ポイント記号を右クリックします。
「プロファイル・ポイント」ウィンドウ(「表示」→「プロファイル・ポイント」)で、削除するプロファイル・ポイントを右クリックし、「削除」を選択します。
現在のプロファイル・ポイントをすべて削除するには、「プロファイル・ポイント」ウィンドウで右クリックし、ポップアップ・メニューで「すべて削除」を選択します。
プロファイラで出力を保存して、後で表示および分析できます。
実行中のプロファイラ・セッションをディスクに保存するには、「ファイル」メニューで「別名保存」を選択します。「別名保存」ダイアログで、セッションを説明する適切な名前(uianalysis.opr
など)を入力するか、またはデフォルト値をそのまま使用します。
注意: アクティブなユースケースを保存中である場合、ユースケースは自動終了します。「終了ユースケース」ツールバー・アイコンは無効になり、「開始ユースケース」ツールバー・アイコンは有効になります。 |
保存されているプロファイラ・セッションを開くには、「ファイル」メニューで「開く」を選択し、表示するセッションまで移動します。
保存されているセッションは、独自のプロファイラ・アイコンによって、アクティブなセッションと視覚的に区別できます。保存されたセッションでは、ユースケースの開始アイコンと終了アイコンは無効になっていますが、複数のユースケースが使用可能である場合、ユースケースのナビゲーション・コントロールはアクティブです。
JDeveloperでは、HPROFバイナリ形式のヒープ・ダンプを開いてプロファイラで表示できます。HPROFバイナリ形式のヒープ・ダンプを作成するには、HPROFプロファイラ、JDKツールのjmapおよびjconsole、またはJavaパラメータ-XX:+HeapDumpOnOutOfMemoryError
を使用します。
たとえば、jmapコマンドを使用してHPROFファイルを作成するには、コマンドラインで次のように入力します。
jmap -dump:format=b,file=heap.hprof <jdev process id>
HPROFの詳細は、http://java.sun.com/javase/reference/index.jsp
を参照してください。
HPROFバイナリ・ファイルを開くには、次のようにします。
「ファイル」メニューから「開く」を選択します。
HPROFバイナリ形式のファイルを参照して選択し、「開く」をクリックします。
プロファイラの「参照」エディタ・タブでヒープ・ダンプが開きます。
注意: 大きいヒープ・ダンプを開く場合には処理が遅くなるため、開くまで数分間かかる場合もあります。Windows XPの場合、990MBを超える大きいHPROFファイルをプロファイラで開くことはできません。 |
Javaクラス図では、クラス、インタフェース、列挙、継承およびコンポジット関係を視覚的に作成し、また既存のJavaクラスおよびインタフェースを表示できます。アプリケーションの特定のファセットを視覚化する場合は、そのファセットを視覚化するためのクラスのみをダイアグラムに追加してください。
JavaクラスをモデリングするにはJavaクラス図から開始する必要があります。ただし、後で他の要素をダイアグラムに追加できます。詳細は、第18.11.10項「Javaクラス図の作成方法」を参照してください。アプリケーションを構成するクラスを、クラス図から直接作成および変更できます。Javaクラス図で行った変更はJavaソース・エディタですぐに反映され、その逆も同様です。
Javaクラス、インタフェースまたは列挙をダイアグラム上に作成するには、そのダイアグラムに対するJavaコンポーネント・パレット上の「Javaクラス」アイコン、「Javaインタフェース」アイコンまたは「Java Enum」アイコンをクリックし、次に、そのクラスを作成するダイアグラムをクリックします。モデリングされたクラスまたはインタフェースのJavaソース・ファイルは、プロジェクトの設定で指定された位置に作成されます。
「Javaクラス」、「Javaインタフェース」、および「Java Enum」の各アイコンは、Javaクラスの名前および詳細を含む四角形として図に表示されます。Javaクラスおよびインタフェースはコンパートメントに分割されており、各コンパートメントに含まれている情報は1種類のみです。
大きさが不足し、すべての内容を表示できない各コンパートメントには、省略記号(...)が表示されます。すべてのフィールドおよびメソッドが表示されるようにモデリングされたクラスを表示するには、クラスを右クリックし、「図形サイズの最適化」、「高さと幅」を選択します。
ダイアグラム上のクラスの各タイプは、名前コンパートメントのステレオタイプにより識別されます。これは、デフォルトでは表示されません。
メンバー(フィールドおよびメソッド)には、可視性を表す記号が表示されます。可視性の記号には、Public (+)、Private (-)およびProtected (#)があります。可視性の記号が使用されていない場合、フィールドまたはメソッドの可視性はPackageになります。
インタフェースは一般的に、複数のメソッドが全体で一貫した1つのサービスを定義している場合に、そのシグネチャをまとめてグループ化する目的で使用されます。あるインタフェースで定義されているサービスをクラスで提供するためには、そのインタフェースを実装します。インタフェース名は、ネームスペース内で一意である必要があります。インタフェースを使用すると、他のクラスが提供する一連のサービスを指定できるため、他のクラスに対してある程度の一貫性を維持できます。
注意: モデリングされたJavaインタフェースでは、拡張関係を使用する他のインタフェースからの継承が可能です。 |
詳細は、第18.3.6項「新規Javaインタフェースの作成方法」を参照してください。
様々なパッケージ、現在のアプリケーションまたはライブラリにあるプライマリ・クラスや内部クラスをダイアグラムに含めることができます。内部Javaクラスおよび内部Javaインタフェースは、それらを所有するクラスのメンバーとして定義します。そのため、これらのクラスはメンバー・クラスとも呼ばれます。
内部クラスおよび内部インタフェースは、ダイアグラム上のモデリングされたJavaクラスまたはJavaインタフェースの内部クラス・コンパートメントに表示されます。内部クラスにはClassという語が、内部インタフェースにはInterfaceという語が接頭辞として付き、可視性の記号とクラス名またはインタフェース名の間に挿入されます。
モデリングされたJavaクラスまたはインタフェースに内部クラスまたは内部インタフェースを作成するには、実装Javaコードに内部クラスを追加するか、既存のモデリングされたクラスの内部ノードとして新規Javaクラスまたはインタフェースを作成します。
内部Javaクラスおよび内部Javaインタフェースには、Javaクラス、Javaインタフェースまたはパッケージに含まれるものと同じ名前を付けることはできません。また、staticフィールドやstaticメソッドを含めることはできません。
ダイアグラムのJavaクラス・コンポーネント・パレットの様々な参照アイコンを使用して、ダイアグラムのクラスとインタフェースとの間に、これまでアソシエーションと呼ばれていた様々な参照をすばやく作成できます。モデリングされたJavaクラス間に作成された参照は、参照を実装するクラスのソース・コードではフィールドとして表されます。ダイアグラム上のコンポジット関係は、参照の方向で開いた実線の矢印で表示されます。表18-11は、ダイアグラムにモデリング可能な参照を示しています。
表18-11 クラスまたはインタフェース間の参照
参照 | 説明 |
---|---|
参照(オブジェクト) |
クラスまたはインタフェース間の唯一の直接参照。これは、 |
参照(配列) |
別のクラスまたはインタフェースの配列への参照。これは、 |
参照(コレクション) |
これは、コレクション宣言としてコードに表されます。必須のimport java.util.Collection;文、およびこの参照を識別するための |
参照(リスト) |
これは、リスト宣言としてコードに表されます。必須のimport java.util.List;文、およびこの参照を識別するための |
参照(マップ) |
これは、マップ宣言としてコードに表されます。必須のimport java.util.Map;文、およびこの参照を識別するための |
参照(セット) |
これは、セット宣言としてコードに表されます。必須のimport java.util.Set;文、およびこの参照を識別するための |
注意: ダイアグラム上の参照のプロパティを迅速に変更するには、その参照をダブルクリックしてコード・エディタを表示し、参照の詳細を変更します。 |
デフォルトでは、参照のラベルが表示されません。参照のラベルを表示するには、参照を右クリックして「ビジュアル・プロパティ」を選択し、「ラベルの表示」を選択します。デフォルトのラベル名は、その参照を表すフィールド名です。ダイアグラムでこのラベル名を選択して変更すると、コードでは@label <label_name>
Javadocタグが参照を表すフィールドの前に追加されます。
ダイアグラム上の参照で使用される集約記号を変更できます。そのためには、まずその参照を右クリックして「参照集約タイプ」を選択し、次に「なし」、「弱い」(@aggregation
共有Javadocタグが参照を表すコードに追加されます)、または「強い」(@aggregation
コンポジットJavadocタグが参照を表すコードに追加されます)を選択します。集約記号は、文書化の目的にのみ使用されます。
Javaソースでextends
文として表現される継承構造は、ダイアグラム上のJavaクラス・コンポーネント・パレットの「拡張」アイコンを使用してJavaクラスのダイアグラムに作成できます。拡張関係は、ダイアグラムでは、拡張クラスまたはインタフェースの方向を白抜きの矢印で指す実線として表示されます。
インタフェースをクラスによって実装する場合、ダイアグラムのJavaコンポーネント・パレットの「実装」アイコンを使用して、インタフェースを作成できます。実装関係を作成すると、実装クラスのソース・コードにimplements
文が追加されます。実装関係は、ダイアグラムでは、実装されたJavaインタフェースの方向を白抜きの矢印で指す破線として表示されます。
拡張関係は、同一クラス・モデルにおける要素間の継承をモデリングします。クラス定義にextends文を作成して、Javaクラス間およびJavaインタフェース間の拡張関係を作成できます。列挙は他のクラスを拡張したり、他のクラスで拡張することはできません。
注意: Javaでは多重クラス継承をサポートしていないため、ダイアグラムのJavaクラスからモデリングできる拡張関係は1つのみです。多重拡張関係は、Javaインタフェースからモデリングできます。 |
実装関係は、モデリングされたJavaインタフェースを、モデリングされたJavaクラスを使用して実装することを指定します。これは、Javaクラスのソースではimplementsキーワードとして表されます。クラス図における実装関係は、実装されるインタフェースへ向けた、先端が白抜きの破線矢印で表します。列挙は、インタフェースを実装できません。
実装されたインタフェースが、モデリングされた別のインタフェースの拡張である場合(extends関係を使用)、これはインタフェースのJavaソース・コードに反映されます。
インタフェースを実装するクラスでは、そのインタフェースの一部またはすべての抽象メソッドの実装が可能です。あるクラスがインタフェースのメソッドを部分的にしか実装しない場合でも、そのクラスはabstractとして定義されます。
Javaクラスまたはインタフェースのメンバー(フィールドおよびメソッド)をダイアグラムに作成できます。フィールドおよびメソッドを、ダイアグラム上のモデリングされたJavaクラスおよびインタフェースに追加します。そのためには、モデリングされたJavaクラスまたはインタフェースをダブルクリックし、Javaソース・エディタを使用してフィールドまたはメソッドを追加します。
フィールドは、モデリングされたJavaクラスまたはJavaインタフェースの特性をカプセル化するために使用されます。モデリングされたすべてのフィールドには、名前、データ型および指定された可視性があります。
フィールドまたはメソッドがダイアグラムのクラスに表示されるとき、接頭辞として+ (publicとして宣言される場合)、- (privateとして宣言される場合)または# (protectedとして宣言される場合)が付きます。staticフィールドはダイアグラム上で下線が引かれます。
メソッドは、クラス内でそのクラスの動作を定義します。メソッドには、スカラー型または他のクラスで定義した型のいずれかの戻り型を指定できます。
パッケージは、要素をグループに編成するための汎用メカニズムです。パッケージ、ファイル、クラス、モデル要素(クラス、インタフェース、エンティティ・オブジェクトなど)をはじめ様々なタイプの要素を含めることができます。パッケージを他のパッケージにネストすることもできます。
パッケージは、様々な要素を所有し、その要素のコンテキストおよびネームスペースを提供します。同じパッケージが所有する各要素の名前は、そのパッケージ内で一意である必要があります。各要素を直接所有するのは1つのパッケージのみですが、他のパッケージから各要素を参照(インポート)できます。つまり、あるパッケージの要素を他のパッケージの他の要素から参照できます。
ダイアグラムでパッケージの名前を変更したり、パッケージを移動すると、移動または名前が変更されたパッケージの内容は自動的にリファクタされ、変更内容が反映されます。
パッケージ名は、大/小文字の違いに関係なく、ネームスペース内で一意である必要があります。
Javaパッケージは、ダイアグラムに作成することも、ナビゲータからダイアグラムにドラッグすることもできます。Javaパッケージのダイアグラムを開くには、ダイアグラム上のそのパッケージを右クリックし、「ドリルダウン」を選択します。
現在表示されている要素に関連するJavaクラスおよびインタフェースを、ダイアグラムに取り込むことができます。これには、選択したクラスまたはインタフェースによって拡張、実装または参照されているクラスまたはインタフェースが含まれます。
注意: クラスがプロジェクトのソースパスからダイアグラムに追加され、それらのクラスがまだプロジェクトにない場合は、それらのクラスが現在のプロジェクトに自動的に追加されます。 |
関連するクラスをダイアグラムに表示するには、次の2つの方法のいずれかを使用します。
ダイアグラムで、関連する要素を表示するクラスまたはインタフェースを選択し、「モデル」→「表示」→「関連する要素」を選択します。
ダイアグラムで、関連する要素を表示するクラスまたはインタフェースを右クリックし、「表示」→「関連する要素」を選択します。
参照を使用すると、Javaクラスまたはインタフェース間の関係をダイアグラムに視覚化できます。参照はダイアグラムで非表示にできます。
Javaクラス間の参照を非表示にするには、次のようにします。
非表示にする参照を右クリックし、「参照の非表示」を選択します。
Javaクラス間の非表示の参照を表示するには、次のようにします。
参照を表すフィールドが定義されているモデリングされたJavaクラスをダブルクリックします。
エディタ・ウィンドウの下部で、「ソース」タブをクリックします。
参照を表すメンバーの上から、attribute
Javadocタグを削除します。
非表示の参照がダイアグラムに表示されます。
注意: ダイアグラムでJavaクラス間の参照を非表示にすると、クラスのJavaソースにコメントが追加されるため、このクラスが他のダイアグラムにもある場合、この参照は他のダイアグラムでも非表示になります。 |
ダイアグラムに表されるクラスの定義、クラスのメンバー、継承およびコンポジット関係は、クラスのJavaソース・コードから直接導出されます。これらはすべてJavaコードとして作成され、ダイアグラムに表示されます。ダイアグラムに表示されているクラスのソース・コードを変更、追加または削除した場合、これらの変更内容は、ダイアグラム上のこれらのクラスおよびインタフェースに反映されます。反対に、モデリングされたクラスに対する変更は、基礎となるソース・コードにも行われます。Javaクラス図上に表示されたコンポジット関係または参照に関する情報の中には、Javadocタグとしてソース・コードに格納されているものもあります。
Javaクラス図には、他のダイアグラム・タイプ(Oracle ADF Business Components、UML要素、Enterprise JavaBeansおよびデータベース・オブジェクト)の図形を含めることができます。UML表記法を使用して、ダイアグラム上のクラスを表示します。モデル化されたUMLクラスは、モデル化されたJavaクラスに変換できます。同様に、モデリングされたJavaクラスは、モデリングされたUMLクラスに変換できます。ノート、依存関係およびURLリンクを使用して、Javaクラスのダイアグラムに注釈を付けることができます。
Javaクラス、インタフェースおよび列挙を、それぞれのメンバー、継承およびコンポジット関係とともに、Javaクラス図に視覚的に作成できます。
UMLクラス、UMLユースケース、オフライン・データベース・オブジェクト、ビジネス・コンポーネント、Enterprise JavaBeansおよびWebサービスをJavaクラス図に作成できます。
ダイアグラムのJavaクラスには有効なJavaクラス名が必要で、クラスのパッケージ内で一意である必要があります。モデリングされたJavaクラスをabstractとして定義した場合は、抽象Javaクラスに対する汎化を使用して具体的なJavaクラスを作成する必要があります。モデリングされた抽象Javaクラスの名前は、イタリックで表示されます。
Javaクラスのダイアグラムを作成するには、次のようにします。
「新規ギャラリ」の「Java Class Diagram」アイコンを使用して新規ダイアグラムを作成します。
Javaクラスのコンポーネント・パレットを使用して、ダイアグラム上に必要なノードを作成します。
また、現在のプロジェクトで使用できるJavaクラスおよびインタフェースをナビゲータからダイアグラムにドラッグ・アンド・ドロップして、それらのクラスのコードに変更を加えたり、既存のコードの構造を視覚化できます。
ヒント: ダイアグラム要素を作成してノートを添付し、ファイルやWebの場所などの他の場所へのURLリンクを追加することにより、ダイアグラムに注釈を付けることもできます。 |
JUnitは、Java対応のリグレッション・テスト用オープン・ソース・フレームワークです。JUnitを使用して、Javaコードを検証するテストを記述および実行します。JUnitの詳細は、 http://www.junit.org/にあるJUnitのWebサイトを参照してください。
テスト・フィクスチャ、テスト・ケースおよびテスト・スイートを作成するには、JDeveloperのJUnitウィザードを使用します。一般的なプロジェクト用のテスト・コンポーネントを作成するウィザードに加えて、ビジネス・コンポーネント・プロジェクトの専用ウィザードが提供されています。
JUnitは、JDeveloperにインストールおよび統合できるオプション機能です。
拡張機能としてJUnitをインストールした後で、追加のオンライン・ドキュメントがインストールされます。これらのヘルプ・トピックは、ヘルプの目次で「Javaプロジェクトに対するJUnitテストの作成」というフォルダの下位にあります。
JUnitは、JDeveloperとともに配布されないオプション機能です。JUnitを使用する場合は、これをダウンロードおよびインストールする必要があります。
注意: JUnitは、IBMのパブリック・ライセンス契約に基づいて提供されています。JUnitをダウンロードする前に、ライセンス契約を受け入れる必要があります。 |
JDeveloperにJUnitをインストールする手順は、次のとおりです。
IDE更新ウィザードを使用して、Oracle Technology Network (OTN)からJUnitをダウンロードします。
JDeveloperを終了し、再起動します。
JUnitがインストールされます。アンインストールする場合は、拡張機能マネージャを使用します。
JUnitテスト・アプリケーションは、次のコンポーネントで構成されます。
1つ以上のテスト・ケース。テスト対象のメソッドを呼び出し、予測される結果についてのアサーションを作成します。デフォルトで生成されるテスト・ケース・クラスは「Test」という名前ですが、ユーザーが任意の有効なJava名を指定できます。
テスト・フィクスチャ。テストが実行される状態を提供します。任意のクラスをテスト・フィクスチャとして使用できますが、JDeveloperには専用のテスト・フィクスチャ・クラスを作成するウィザードも用意されています。デフォルトで生成されるテスト・フィクスチャ・クラスは「Fixture」という名前ですが、ユーザーが任意の有効なJava名を指定できます。
テスト・スイート。テスト・ケースを呼び出します。デフォルトのテスト・スイート・クラスは、「AllTests」という名前です。
ランナー。テスト・スイートを呼び出し、テスト結果を相関付けて表示します。
テスト・フィクスチャとは、既知の値を持つオブジェクトのセットで、テスト・ケースにデータを提供します。任意のクラスをテスト・フィクスチャとして使用できますが、JDeveloperにはカスタムのテスト・フィクスチャ・クラスや様々な専用のテスト・フィクスチャを作成できるウィザードも用意されています。
JUnitのカスタムのテスト・フィクスチャ・クラスを作成するには、次のようにします。
ナビゲータでプロジェクトを選択します。
「ファイル」→「新規」を選択し、「新規ギャラリ」を開きます。
「カテゴリ」ツリーで「一般」を開き、「ユニット・テスト」を選択します。
「項目」リストで、「テスト・フィクスチャ」をダブルクリックします。
ウィザードを完了するとテスト・フィクスチャ・クラスが作成されます。ウィザードによって作成されたクラスが、編集用に開かれます。
「カテゴリ」ツリーで「一般」を開き、「ユニット・テスト」(JUnit)を選択します。
「項目」リストで、「カスタム・テスト・フィクスチャ」をダブルクリックします。
ウィザードを完了するとテスト・フィクスチャ・クラスが作成されます。詳細を参照するには、ダイアログ内で[F1]を押すか「ヘルプ」をクリックします。
「カテゴリ」ツリーで、「ユニット・テスト」を展開します。
「テスト・スイート」→「OK」をクリックします。
「項目」リストで、「テスト・フィクスチャ」をダブルクリックします。
ウィザードを完了するとテスト・フィクスチャ・クラスが作成されます。詳細を参照するには、ダイアログ内で[F1]を押すか「ヘルプ」をクリックします。
ウィザードによって作成されたクラスが、編集用に開かれます。
必要に応じてファイルを変更します。具体的には、テスト・フィクスチャ・オブジェクトを初期化するコードをsetUp()メソッドに追加し、取得されたリソースを解放するコードをtearDown()メソッドに追加します。
テスト・フィクスチャとは、既知の値を持つオブジェクトのセットで、テスト・ケースにデータを提供します。JDBCテスト・フィクスチャは、使用するテスト・ケースにデータベース接続を確立するコードを提供します。
JUnitのJDBCテスト・フィクスチャ・クラスを作成するには、次のようにします。
ナビゲータでプロジェクトを選択します。
「ファイル」、「新規」を選択し、「新規ギャラリ」を開きます。
「カテゴリ」ツリーで「一般」を開き、「ユニット・テスト」(JUnit)を選択します。
「項目」リストで、「JDBCテスト・フィクスチャ」をダブルクリックします。
ダイアログを完了するとテスト・フィクスチャ・クラスが作成されます。詳細を参照するには、ダイアログ内で[F1]を押すか「ヘルプ」をクリックします。
作成されたクラスが、編集用に開かれます。
必要に応じてファイルを変更します。具体的には、テスト・フィクスチャ・オブジェクトを初期化するコードをsetUp()
メソッドに追加し、取得されたリソースを解放するコードをtearDown()
メソッドに追加します。
テスト・ケース・クラスには、JUnitのアサーションを呼び出してテストを実行する1つ以上のメソッドがあります。例18-8に、JUnit 3.xでの典型的なテスト・ケースを示します。この例では、テスト対象のメソッドにテスト・フィクスチャ・データを渡してから、その結果を既知の値と比較し、予測どおりかどうかを確認しています。
例18-8 JUnit 3.xのテスト・ケース
public void testCountChars() { int expected = 4; int actual = fixture1.countChars('a'); assertEquals(expected, actual); }
例18-9 JUnit 4のテスト・ケース
@Test public void testCountChars() { int expected = 4; int actual = fixture1.countChars('a'); Assert.assertEquals(expected, actual); }
例18-9に示したテスト・ケースでは、countChars()
がテスト対象であり、テストの結果をassertEquals()
でチェックしています。これは、JUnit Assertクラスで定義されているアサーション・メソッドの一種です。テスト・フィクスチャfixture1
の状態はsetUp()
メソッドで確立され、このメソッドは例18-10で示すようにテスト・ケースの呼出しより前に呼び出されていました。
例18-10 setUp()メソッド
protected void setup() throws Exception { fixture1 = new StringFixture("Goin' to Kansas City, Kansas City, here I come."); }
JUnitテスト・ケース・クラスを作成するには、次のようにします。
ナビゲータで、テストするプロジェクトまたは特定のクラスを選択します。
「ファイル」、「新規」を選択し、「新規ギャラリ」を開きます。
「カテゴリ」ツリーで「一般」を開き、「ユニット・テスト」(JUnit)を選択します。
「項目」リストで、「テスト・ケース」をダブルクリックします。
ウィザードを完了するとテスト・フィクスチャ・クラスが作成されます。ウィザードによって作成されたクラスが、編集用に開かれます。
テスト・スイートは、テスト・ケースを呼び出すクラスです。
JUnitテスト・スイート・ウィザードには、main()メソッドと、TestRunnerクラスのコールとを挿入するオプションがあります。「JUnit TestRunner」ログ・ウィンドウが開き、テスト結果が表示されます。別のテスト・ランナーを使用する場合には、メソッドを編集します。
例18-11に示したJUnit 3.xテスト・スイートでは、suite()
メソッドによってTestSuiteインスタンスが作成され、それにテスト・ケースが追加されます。テスト・ケースを追加または削除する場合には、このメソッドを編集します。
例18-11 JUnit 3.xのテスト・スイート
public class AllTests { public static Test suite() { TestSuite suite; suite = new TestSuite("project1.AllTests"); return suite; }
例18-12に示したJUnit 4テスト・スイートでは、テスト・ケース・クラスは@Suiteおよび@RunWithの注釈を付けて記述されています。
例18-12 JUnit 4のテスト・スイート
@RunWith(Suite.class) @Suite.SuiteClasses( {}) public class AllTests1 { public static void main(String[] args) { String[] args2 = { AllTests1.class.getName() }; org.junit.runner.JUnitCore.main(args2); } }
JUnitテスト・スイート・クラスを作成するには、次のようにします。
ナビゲータでプロジェクトを選択します。
「ファイル」、「新規」を選択し、「新規ギャラリ」を開きます。
「カテゴリ」ツリーで「一般」を開き、「ユニット・テスト」(JUnit)を選択します。
「項目」リストで、「テスト・スイート」をダブルクリックします。
ウィザードを完了するとテスト・フィクスチャ・クラスが作成されます。ウィザードによって作成されたクラスが、編集用に開かれます。
必要に応じてファイルを変更します。詳細は次のとおりです。
suite()メソッドでテスト・ケースを追加します。
main()メソッドで、必要に応じてランナーの呼出しを置き換えます。
メソッドに対するユニット・テストを、既存のJUnitテスト・ケース・クラスに追加できます。
JUnitテスト・ケース・クラスにテストを追加するには、次のようにします。
コード・エディタで、新しいユニット・テストを作成するメソッドを選択します。
メイン・メニューから「ソース」→「新規メソッドのテスト」を選択します。「新規メソッドのテスト」ダイアログが開きます。
「既存のTestCaseクラスに追加」を選択します。
「クラス名」ドロップダウン・ボックスから、または「参照」を使用して、新しいテストを追加するテスト・ケース・クラスを選択します。
新しいテストをテスト・ケースに追加するには、「OK」をクリックします。
プロジェクトのすべてのテスト・ケースでテスト・スイートを更新します。
テスト・スイートを更新するには、次のようにします。
suite()メソッドを持つクラスで、メイン・メニューから「ソース」→「テスト・スイートのリフレッシュ」を選択します。「テスト・スイートのリフレッシュ」ダイアログが開きます。
テスト・ケースのリストにあるすべての項目がチェックされていることを確認してください。
テスト・スイートを更新するには「OK」をクリックします。