フィールドクラス
フィールドクラスは、フィールドのタイプを照会し、フィールドの値を設定または読み取るために使用できるいくつかのメソッドを定義します。これらのメソッドを継承されたメンバーメソッドと組み合わせることで、フィールド宣言に関するすべての情報を見つけ、特定のオブジェクトまたはクラスのフィールドを操作できるようになります。
getGenerictypeメソッドは、フィールドの宣言タイプを表すタイプインスタンスを返します。 stringやintなどの些細なタイプの場合、メソッドは、string.classやint.classoなど、list <stri ng>などのパラメーター化されたタイプなど、それに関連付けられたクラスオブジェクトを返します。たとえば、timeの場合、メソッドはparameterizedrypeのインスタンスを返します。メソッドは時代遅れのインスタンスを返します。
Legacy GetTypeメソッドは、フィールドのタイプのクラスオブジェクトを返します。些細なタイプの場合、メソッドはgetGenerictypeメソッドと同じように動作します。宣言されたタイプのフィールドがパラメーター化されたタイプである場合、getTypeメソッドは、パラメーター化されたタイプの消去、つまり元の型のクラスオブジェクトの対応するクラスオブジェクトを返します。たとえば、リスト<stri ng>として宣言されたオブジェクトの場合、getTypeはLi St.クラスを返します。宣言されたタイプのフィールドがタイプ変数である場合、getTypeメソッドは、タイプ変数を消去するために対応するクラスオブジェクトを返します。たとえば、クラスfoo <ding>があり、t型として宣言されたフィールドの場合、ypeを取得するとオブジェクトを返します。
クラスオブジェクト。 fooがfoo <extends number>として宣言されている場合、getの下でypeはnumber.classを返します。
ISENUMCONSTANTメソッドを使用して、フィールドが列挙定数であるかどうかを照会するか、GETおよびSETメソッドを使用してフィールドの値を取得および設定できます。オブジェクトの引用を受け入れ、オブジェクトECT値を返すこれらのメソッドには、共通のフォームと、基本的なタイプに直接対処できるいくつかの専門的なフォームがあります。これらのすべての方法は、操作するオブジェクトを指定する引用を受け入れます。静的フィールドの場合、このオブジェクトの引用は無視されるため、設定することもできます
nullに設定します。次の方法では、オブジェクトの短いフィールドの値を印刷します。
public static void printshortfield(Object o、string name)nosuchfieldexception、Illegalaccessexception {field field = o.getClass()。getfield(name); short value =(short)field.get(o); System.out.println(value);GETメソッドの返品値は、このフィールドで参照される任意のオブジェクトにすることができます。フィールドがプリミティブタイプの場合、メソッドは適切なタイプのラッパークラスオブジェクトを返します。 「Hortタイプのフィールドの場合、GETメソッドはフィールドの値を含む型短編のオブジェクトを返し、ローカル変数値に割り当てられた場合、オブジェクト値は自動的にボックス化されません。
セットメソッドの使用は似ています。短いフィールドを提供された値に設定する方法は、次のようになります。
public static voi setShortfield(オブジェクトO、文字列名、短いNV)がNOSUCHFIELDEXCEPTION、ILLEGALACCESSEXCEPTION FIELD = 0.GETCLASS()。getfield(name); field .set(o .nv);
SETはオブジェクトタイプのパラメーターを受け入れますが、短い値を直接渡して、ラップ変換で短いオブジェクトにラップすることができます。
上記の方法では、指定されたオブジェクトのドメインがアクセスできず、このアクセス制御が施行されている場合、Illegalaccessexceptionの例外がスローされます。渡されたオブジェクトがドメインのタイプとは異なる場合、違法なメモン化エクセプトの例外がスローされます。ドメインが非静的で、渡されたオブジェクト参照がnullの場合、nullpointerexceptionの例外がスローされます。静的ドメインにアクセスするには、クラスを初期化する必要がある場合があるため、メソッドは例外の例外もスローします。
フィールドクラスには、基本タイプを取得および設定するための特定の方法もあります。たとえば、getPrimitive7ypeを呼び出して、Primitive7ypeが(資本化された)基本タイプ名であるフィールドオブジェクトにPrimitive7ypeを設定できます。 GETメソッドは、次のステートメントで使用できます。
short value = field.getshhort(o);
設定された方法は、次のステートメントで使用できます。
field.setshort(o、nv);
上記の2つの方法で宣言されたステートメントでは、ラッパータイプのオブジェクトの使用を回避できます。
フィールドクラスは注釈を付けたインターフェイスを実装するため、セクション16.2のようなドメインにクエリして適用することもできます。
メモ。
上記の方法を使用すると、フィールドオブジェクトを任意の値を操作する方法として使用できますが、それを避けようとする必要があります。 Java言語は、プログラムのコンパイル期間中にできるだけ多くのプログラミングエラーをキャッチするため、コードを作成するときに「Ieldオブジェクト」などの間接的なメソッドが少ないため、コードにコンパイルする前により多くのエラーを防ぐことができます。さらに、前のコードでは、正確に何が起こるかを知るために、通常の構文でドメイン名を直接使用する場合よりも、読み物の読み取りに多くのエネルギーを費やしていることがわかります。
最終フィールド
通常、フィールドを設定したファイナルを宣言します。
例外、これは私たちが期待できることです。なぜなら、最終フィールドの価値は決して変わらないからです。しかし、いくつかの特別なケースがあります - たとえば、カスタマイズされた脱派化(セクション20.8.4を参照)では、最終フィールドの値を変更することは理にかなっています。これは、インスタンスフィールドでの反射によってのみ達成できます。 SetAccessable(True)を正常に呼び出すだけでは不十分であり、実際に呼ばなければならないことに注意してください。
この機能は、高度に専門化されたコンテキストのために提供されており、一般的な目的ではありません。コンテンツのみを維持するためにのみ紹介します。カスタマイズされた敏arialializationなどの特定のコンテキストから外れている場合、最終フィールドの価値を変更すると、予期せぬまたは壊滅的な結果にさえつながる可能性があります。これらのコンテキスト以外では、最終フィールドの変更が表示されるという保証はありません。このようなコンテキストでさえ、このテクノロジーを使用してエンコードするときにセキュリティメカニズムがコードの実行を妨げないようにする必要があります。一定変数の値で最終フィールドを変更する(セクション2.2.3を参照)は、反射を使用してそのような変更が達成されない限り、この変更を見えなくします。
メソッドクラス
メソッドクラスとメンバークラスからの継承されたメソッドにより、メソッド宣言に関する完全な情報を取得できます。
「パブリックタイプgetGenericReturnTypeo:このメソッドは、ターゲットメソッドの返品タイプのタイプオブジェクトを返します。ターゲットメソッドがvoidを返すように宣言されている場合、メソッドはvoid.classoを返します。
「public型[] getGenericParametertypes():このメソッドは、ターゲットメソッドのすべてのパラメータータイプのタイプオブジェクトの配列を返します。これは、パラメーターの宣言の順序で配列に保存されます。ターゲットメソッドにパラメーターがない場合、メソッドは空の配列を返します。
.publ ic type [] getgeneri cacheti onTypes Q:このメソッドは、スロー節にリストされているすべての例外タイプのタイプオブジェクトの配列を返します。これは、例外宣言の順に配列に保存されます。
ターゲットメソッドが例外を宣言しない場合、メソッドは空の配列を返します。
Javaはまた、getReturnType、getParameterTypes、およびgetExceptionTypesメソッドを提供して、field.getTypeを使用する場合と同じように、パラメーター化されたタイプとタイプ変数は、それらの消去に対応するクラスオブジェクトによって表されます。
メソッドクラスは注釈を付けたものを実装し、セクション16.2で説明した方法に適用される注釈を照会できます。さらに、メソッドクラスは、メソッドパラメーターに適用された注釈へのアクセスを提供するためのgetParameterAnnotationsも提供します。 getParameterAnnotationsメソッドは、最外配列の各要素がメソッドのパラメーターに対応するアノテーションアレイを返すことができます。パラメーターに注釈がない場合、メソッドはこのパラメーターの長さ0の注釈配列を返します。メソッドオブジェクトによって表されるメソッドがそれ自体が注釈要素である場合、getDefaultValueメソッドは、要素のデフォルト値を表すオブジェクトオブジェクトを返します。メソッドオブジェクト自体がアノテーション要素ではない場合、またはデフォルト値がない場合、メソッドはnull.methodクラスも汎用デクラレーションを実装しているため、getTyparametersメソッドが定義され、タイプヴァリファイオブジェクトの配列が返されます。指定されたメソッドオブジェクトが一般的なメソッドではない場合、メソッドは空の配列を返します。
Isvarargsメソッドを使用して、メソッドオブジェクトが可変インデックスメソッドであるかどうかを確認できます。iSbridgeメソッドを使用して、ブリッジメソッドかどうかを確認できます。
メソッドオブジェクトを使用する最も興味深い方法は、それ自体を反射的に呼び出すことです。
.publicオブジェクトが呼び出されます(オブジェクト、オブジェクト、オブジェクト…args)は、違法行為、違法なexception、argetexceptionをスローします。非静的な方法では、実際のタイプの上のタイプは、呼び出される方法の実装を決定しますが、静的方法ではこれは無視され、通常はnullに設定されます。 ARGSの値の数は、呼び出されたメソッドの実際のパラメーターと同じでなければならず、これらの値のタイプはすべて呼び出されたメソッドのパラメーターに割り当てられなければなりません。それ以外の場合は、LlegalargumentExceptionの例外を取得します。変数引用方法の最後のパラメーターは配列であるため、実際に渡す「変動可能な」引用で配列を埋める必要があることに注意してください。アクセスできないメソッドを呼び出したい場合、メソッドはIllegalaccessexceptionの例外をスローします。呼び出された方法がONオブジェクトのメソッドではない場合、メソッドは例外に対してllegalargumentExceptiをスローします。これがnullであり、非静的である場合、メソッドはNo 1pointerexception例外をスローします。このメソッドオブジェクトが静的メソッドを表し、静的メソッドがまだ状態にあると宣言するクラスが初期化される場合、メソッドは例外を投げかけます。呼び出された方法にエイリアンの力がある場合、InvocationTargetException例外がスローされます。
Invokeメソッドを使用すると、基本タイプを直接渡すことができます。または、適切なラッパークラスを使用できます。ラッパークラスで表されるタイプは、メソッドで宣言されたパラメータータイプに割り当てる必要があります。長いフロート、またはダブルを使用してダブルタイプの引用をラップすることはできますが、ダブルを長いオート麦に割り当てることができないため、長いまたはフロートタイプの引用をラップするためにダブルを使用することはできません。 Invokeメソッドによって返されるオブジェクトの処理方法は、field.getと同じです。これは、それらに対応するラッパークラスの基本タイプを返します。メソッドが無効と宣言されている場合、Invokeメソッドはnullを返します。
簡単に言えば、Invokeを使用して通話メソッドを使用する場合、Java言語では法的パラメーターのみを使用できます。
同じタイプと値の優先順位。たとえば、次の呼び出し
return str.indexof( "。"、8);
反射を使用して、次の形式で書くことができます。
投げ可能なFAS; try {method indexm = string.class。 getMethod( "index0f"、string.class、int.class); return(integer)indexm.invoke(str、 "、"、8); } catch(nosuchmethodexception e){故障= e; } catch(InvocationTargetException e){fas = e .getCause(); } catch(Illegalaccessexception e){fails = e; } fasを投げます。直接コールのコンパイラのセキュリティチェックは、反射を使用するときに実行時に呼び出しを使用する場合にのみ実行できますが、反射ベースのコードには、直接コールされたコードに意味的に同等のセキュリティチェックがあります。アクセスチェックは、わずかに異なる方法で実行される場合があります。セキュリティマネージャーは、直接呼び出すことができても、パッケージ内のメソッドへのアクセスを拒否する場合があります。
この形式の通話を使用できる場合、それを避ける正当な理由があります。ただし、デバッガーまたはオブジェクトの操作としてユーザー入力を解釈する必要がある他の一般的なアプリケーションを作成するときに、InvokeまたはGet/Setメソッドを使用する場合は理にかなっています。メソッドオブジェクトは、他の言語と同様のメソッドポインターとしてある程度使用できますが、特にインターフェイス、抽象クラス、ネストされたクラスがあり、他の言語のメソッドポインターで通常解決される問題に対処するために使用できます。