モジュール java.base
パッケージ java.lang.reflect

クラスAccessibleObject

java.lang.Object
java.lang.reflect.AccessibleObject
すべての実装されたインタフェース:
AnnotatedElement
直系の既知のサブクラス:
Executable, Field

public class AccessibleObject extends Object implements AnnotatedElement
AccessibleObjectクラスは、FieldMethod、およびConstructorオブジェクト(「反射物」と呼ばれる)の基本クラスです。 Java言語アクセス制御の使用時に、反映されたオブジェクトにJava言語アクセス制御の抑制チェックとしてフラグを付けることができます。 これにより、Javaオブジェクト直列化やその他の永続性メカニズムなど、十分な権限を持つ高度なアプリケーションが、通常禁止される方法でオブジェクトを操作できます。

Java言語アクセス制御では、トップレベル・クラス外部のプライベート・メンバー、パッケージ・アクセス外部のメンバー、パッケージまたはサブクラス外の保護されたメンバー、およびそれらがexportedパッケージとユーザーreadsモジュールで宣言されていないかぎり、そのモジュール外のパブリック・メンバーを使用できません。 デフォルトでは、Field s、Method sまたはConstructor sを使用してフィールドを取得または設定したり、メソッドを起動したり、クラスの新しいインスタンスを作成および初期化したりする場合、Java言語アクセス制御は(1つのバリエーションで)に適用されます。 すべての反映されたオブジェクトは、それを使用するコードが適切なクラス、パッケージまたはモジュール内にあることをチェックします。 スタック上にJavaクラスがない「JNIコード」により起動された場合のチェックは、メンバーと宣言しているクラスがパブリックであり、すべてのモジュールにエクスポートされるパッケージ内にクラスがある場合にのみ成功します。

Java言語アクセス制御の1つのバリエーションは、反映されたオブジェクトによるチェックが可読性を前提としていることです。 つまり、反映されたオブジェクトの使用を含むモジュールは、基礎となるフィールド、メソッドまたはコンストラクタが宣言されているモジュールを読み取るものとみなされます。

Java言語のアクセス制御のためのチェックが(したがって、アクセスを有効にできるかどうか)を抑制することができるかどうかは、反射されたオブジェクトは、エクスポートまたはオープン・パッケージ(setAccessible(boolean)を参照してください)のメンバーに対応するかどうかに依存します。

Java言語仕様を参照してください:
6.6 アクセス制御
導入されたバージョン:
1.2
外部仕様
  • コンストラクタのサマリー

    コンストラクタ
    修飾子
    コンストラクタ
    説明
    protected
    非推奨。
  • メソッドのサマリー

    修飾子と型
    メソッド
    説明
    final boolean
    呼出し側がこの反映されたオブジェクトにアクセスできるかどうかをテストします。
    <T extends Annotation>
    T
    getAnnotation(Class<T> annotationClass)
    存在する場合は、この要素の指定された型の注釈を返し、そうでない場合はnullを返します。
    この要素に存在する注釈を返します。
    <T extends Annotation>
    T[]
    getAnnotationsByType(Class<T> annotationClass)
    この要素に関連付けられている注釈を返します。
    <T extends Annotation>
    T
    getDeclaredAnnotation(Class<T> annotationClass)
    直接存在する場合は、この要素の指定された型の注釈を返し、そうでない場合はnullを返します。
    この要素に直接存在する注釈を返します。
    <T extends Annotation>
    T[]
    getDeclaredAnnotationsByType(Class<T> annotationClass)
    直接存在する間接的に存在する場合は、この要素の指定された型の注釈を返します。
    boolean
    非推奨。
    このメソッドは、Java言語のアクセス制御のチェックが抑制されているかどうかを実際に示しているときに、反映されたオブジェクトにアクセス可能かどうかを調べるというヒントを持つため、非推奨です。
    boolean
    isAnnotationPresent(Class<? extends Annotation> annotationClass)
    指定された型の注釈がこの要素に存在する場合はtrueを返し、そうでない場合はfalseを返します。
    void
    setAccessible(boolean flag)
    この反映オブジェクトのaccessibleフラグを指定されたブール値に設定します。
    static void
    setAccessible(AccessibleObject[] array, boolean flag)
    単一のセキュリティ・チェック(効率化のため)で反射オブジェクトの配列のaccessibleフラグを設定する便利なメソッド。
    final boolean
    可能な場合は、この反映されたオブジェクトのaccessibleフラグをtrueに設定します。

    クラスjava.lang.Objectで宣言されたメソッド

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • コンストラクタの詳細

    • AccessibleObject

      @Deprecated(since="17") protected AccessibleObject()
      非推奨。
      コンストラクタで、Java仮想マシンだけが使用します。
  • メソッドの詳細

    • setAccessible

      public static void setAccessible(AccessibleObject[] array, boolean flag)
      単一のセキュリティ・チェック(効率化のため)で反射オブジェクトの配列のaccessibleフラグを設定する便利なメソッド。

      このメソッドは、各反射オブジェクトへのアクセスをsetAccessible(boolean)で指定されたとおりに有効にできるときに、配列内のすべての反射オブジェクトにアクセスできるようにするために使用できます。

      セキュリティ・マネージャが存在する場合、そのcheckPermissionメソッドが最初にReflectPermission("suppressAccessChecks")権限でコールされます。

      SecurityExceptionは、入力arrayのいずれかの要素がクラスjava.lang.ClassConstructorオブジェクトであり、flagがtrueの場合にもスローされます。

      パラメータ:
      array - AccessibleObjectの配列
      flag - 各オブジェクトのaccessibleフラグの新しい値
      例外:
      InaccessibleObjectException - アレイ内のすべてのオブジェクトに対してアクセスを有効にできない場合
      SecurityException - リクエストがセキュリティ・マネージャによって拒否された場合、または配列内の要素が java.lang.Classのコンストラクタである場合
      関連項目:
    • setAccessible

      public void setAccessible(boolean flag)
      この反映オブジェクトのaccessibleフラグを指定されたブール値に設定します。 trueは、Java言語アクセス制御の使用時に、反映されたオブジェクトがチェックを抑制する必要があることを示します。 falseは、反映されたオブジェクトが使用されるときにJava言語アクセス制御のチェックを強制することを示し、クラスの説明に示されているバリエーションを示します。

      このメソッドは、Cクラスの呼び出し側がdeclaring class Dmemberへのアクセスを可能にするために使用されます:

      • CDは同じモジュール内にあります。
      • メンバーはpublicであり、Dはパッケージ内のpublicであり、D exportsを含むモジュールは少なくともCを含むモジュールに含まれます。
      • メンバーはprotected staticDはパッケージ内のpublicであり、Dを含むモジュールは少なくともCを含むモジュールにエクスポートし、CDのサブクラスです。
      • Dは、少なくともCを含むモジュールにD opensを含むモジュールがパッケージされています。 名前なしモジュールおよびオープン・モジュール内のすべてのパッケージは、すべてのモジュールに対して開かれているため、Dが名前なしモジュールまたはオープン・モジュールにある場合、このメソッドは常に成功します。

      このメソッドは、次の場合にのみdeclaring class Dmemberへのアクセスを有効にするために、スタック上にコール元クラスがない「JNIコード」で使用できます:

      • メンバーはpublicで、DD exportsが無条件に含まれるパッケージ内のpublicです。

      宣言クラスが呼出し側と異なるモジュールにあり、宣言クラスを含むパッケージが呼出し側のモジュールに対して開かれていない場合、このメソッドは、プライベート・メンバー、デフォルトの(package)アクセス権を持つメンバー、保護されたインスタンス・メンバーまたは保護されたコンストラクタへのアクセスを有効にするために使用できません。

      このメソッドを使用して、non-modifiable最終フィールドへのwriteアクセスを有効にすることはできません。 次のフィールドは変更できません:

      • 任意のクラスまたはインタフェースで宣言されたstatic finalフィールド
      • 「非表示クラス」で宣言された最終フィールド
      • 「レコード」で宣言された最終フィールド

      trueがJava言語アクセス制御チェックを抑制して、これらの変更不可能な最終フィールドへのreadアクセスのみを有効にする場合のaccessibleフラグ。

      セキュリティ・マネージャが存在する場合、そのcheckPermissionメソッドが最初にReflectPermission("suppressAccessChecks")権限でコールされます。

      パラメータ:
      flag - accessibleフラグの新しい値
      例外:
      InaccessibleObjectException - アクセスを有効にできない場合
      SecurityException - リクエストがセキュリティ・マネージャによって拒否された場合
      外部仕様
      関連項目:
    • trySetAccessible

      public final boolean trySetAccessible()
      可能な場合は、この反映されたオブジェクトのaccessibleフラグをtrueに設定します。 このメソッドは、setAccessible(true)を呼び出すかのようにaccessibleフラグを設定し、accessibleフラグに対して更新される可能性がある値を返します。 アクセスを有効にできない場合、つまり、チェックまたはJava言語のアクセス制御を抑制できない場合、このメソッドはfalse ( setAccessible(true)が失敗したときにInaccessibleObjectExceptionをスローするのではなく)を返します。

      この反射オブジェクトのaccessibleフラグがtrueの場合、このメソッドはno-opです。

      たとえば、コール元は、プライベート・インスタンス・メソッドp.T::privateMethodMethodオブジェクトに対してtrySetAccessibleを呼び出して、Methodの起動時にJava言語アクセス制御のチェックを抑制できます。 p.Tクラスが呼出し側と異なるモジュール内にあり、pパッケージが少なくとも呼出し側のモジュールに対して開かれている場合、次のコードはaccessibleフラグをtrueに正常に設定します。

       
           p.T obj = ....;  // instance of p.T
           :
           Method m = p.T.class.getDeclaredMethod("privateMethod");
           if (m.trySetAccessible()) {
               m.invoke(obj);
           } else {
               // package p is not opened to the caller to access private member of T
               ...
           }
       

      このメソッドが「JNIコード」によって起動され、コール元クラスがスタック上にない場合、accessibleフラグを設定できるのは、メンバーおよび宣言元クラスがパブリックで、クラスが無条件にエクスポートされるパッケージ内にある場合のみです。

      セキュリティ・マネージャが存在する場合、そのcheckPermissionメソッドが最初にReflectPermission("suppressAccessChecks")権限でコールされます。

      戻り値:
      accessibleフラグがtrueに設定されている場合はtrue、アクセスを有効にできない場合はfalse
      例外:
      SecurityException - リクエストがセキュリティ・マネージャによって拒否された場合
      導入されたバージョン:
      9
      外部仕様
      関連項目:
    • isAccessible

      @Deprecated(since="9") public boolean isAccessible()
      非推奨。
      このメソッドは、Java言語のアクセス制御のチェックが抑制されているかどうかを実際に示しているときに、反映されたオブジェクトにアクセス可能かどうかを調べるというヒントを持つため、非推奨です。 このメソッドは、コール元がアクセスできる反映されたオブジェクトに対してfalseを返す場合があります。 この反射オブジェクトにアクセスできるかどうかをテストするには、canAccess(Object)を使用します。
      この反映されたオブジェクトのaccessibleフラグの値を取得します。
      戻り値:
      オブジェクトのaccessibleフラグの値
    • canAccess

      public final boolean canAccess(Object obj)
      呼出し側がこの反映されたオブジェクトにアクセスできるかどうかをテストします。 このリフレクト・オブジェクトがインスタンス・メソッドまたはフィールドに対応している場合、このメソッドは、コール元がリフレクトされたオブジェクトを使用して指定されたobjにアクセスできるかどうかをテストします。 例えばメソッドやフィールドの場合、obj引数はdeclaring classのインスタンスでなければなりません。 静的メンバーとコンストラクタの場合、objnullでなければなりません。

      このメソッドは、accessibleフラグがtrueに設定されている場合、つまりJava言語アクセス制御のチェックが抑制されている場合、または「Java言語仕様」で指定されているように呼出し側がメンバーにアクセスできる場合にtrueを返します(クラスの説明にはバリエーションが記載されています)。 このメソッドが「JNIコード」によって起動され、コール元クラスがスタック上にない場合、メンバーおよび宣言クラスがpublicで、クラスが無条件にエクスポートされるパッケージ内にある場合、このメソッドはtrueを返します。

      パラメータ:
      obj - インスタンス・メソッドまたはフィールドの場合、この反映されたオブジェクトの宣言クラスのインスタンス・オブジェクト
      戻り値:
      呼出し側がこの反映されたオブジェクトにアクセスできる場合はtrue
      例外:
      IllegalArgumentException -
      • この反映されたオブジェクトが静的メンバーまたはコンストラクタであり、指定されたobjが非nullの場合、または
      • この反映されたオブジェクトがインスタンス・メソッドまたはフィールドであり、指定されたobjnullであるか、メンバーのdeclaring classのサブクラスではない型である場合。
      Java言語仕様を参照してください:
      6.6 アクセス制御
      導入されたバージョン:
      9
      外部仕様
      関連項目:
    • getAnnotation

      public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
      存在する場合は、この要素の指定された型の注釈を返し、そうでない場合はnullを返します。

      このメソッドによって返される注釈は宣言注釈であることに注意してください。

      定義:
      getAnnotation、インタフェースAnnotatedElement
      実装要件:
      デフォルトの実装ではUnsupportedOperationExceptionがスローされます。サブクラスはこのメソッドをオーバーライドする必要があります。
      型パラメータ:
      T - 照会し、存在する場合に返す注釈の型。
      パラメータ:
      annotationClass - 注釈型に対応するClassオブジェクト
      戻り値:
      存在する場合は、この要素の指定された注釈型の注釈。そうでない場合はnull
      例外:
      NullPointerException - 指定された注釈クラスがnullの場合
      導入されたバージョン:
      1.5
    • isAnnotationPresent

      public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
      指定された型の注釈がこの要素に存在する場合はtrueを返し、そうでない場合はfalseを返します。 このメソッドは、主にマーカー注釈への簡易アクセスを目的に設計されています。

      このメソッドによって返されるtrue値は、getAnnotation(annotationClass) != nullと同等です。

      定義:
      isAnnotationPresent、インタフェースAnnotatedElement
      パラメータ:
      annotationClass - 注釈型に対応するClassオブジェクト
      戻り値:
      指定された注釈型の注釈がこの要素に存在する場合はtrue、そうでない場合はfalse
      例外:
      NullPointerException - 指定された注釈クラスがnullの場合
      導入されたバージョン:
      1.5
    • getAnnotationsByType

      public <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass)
      この要素に関連付けられている注釈を返します。 この要素に関連付けられている注釈がない場合、戻り値は長さ0の配列です。 このメソッドとAnnotatedElement.getAnnotation(Class)の違いは、引数が「繰返し可能な注釈タイプ」 (JLS 9.6)であるかどうかをこのメソッドが検出し、その場合、"検索"がコンテナ注釈を使用してそのタイプの注釈を検索しようとすることです。 このメソッドの呼出し元は、返された配列を自由に変更することができ、これはほかの呼出し元に返された配列に影響を及ぼしません。

      このメソッドによって返される注釈は宣言注釈であることに注意してください。

      定義:
      getAnnotationsByType、インタフェースAnnotatedElement
      実装要件:
      デフォルトの実装ではUnsupportedOperationExceptionがスローされます。サブクラスはこのメソッドをオーバーライドする必要があります。
      型パラメータ:
      T - 照会し、存在する場合に返す注釈の型。
      パラメータ:
      annotationClass - 注釈型に対応するClassオブジェクト
      戻り値:
      この要素に関連付けられている場合は、この要素の指定された注釈型のすべての注釈。そうでない場合は長さ0の配列
      例外:
      NullPointerException - 指定された注釈クラスがnullの場合
      導入されたバージョン:
      1.8
    • getAnnotations

      public Annotation[] getAnnotations()
      この要素に存在する注釈を返します。 この要素に存在する注釈がない場合、戻り値は長さ0の配列です。 このメソッドの呼出し元は、返された配列を自由に変更することができ、これはほかの呼出し元に返された配列に影響を及ぼしません。

      このメソッドによって返される注釈は宣言注釈であることに注意してください。

      定義:
      getAnnotations、インタフェースAnnotatedElement
      戻り値:
      この要素に存在する注釈
      導入されたバージョン:
      1.5
    • getDeclaredAnnotation

      public <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass)
      直接存在する場合は、この要素の指定された型の注釈を返し、そうでない場合はnullを返します。 このメソッドは継承された注釈を無視します。 (この要素に直接存在する注釈がない場合は、nullを返します。)

      このメソッドによって返される注釈は宣言注釈であることに注意してください。

      定義:
      getDeclaredAnnotation、インタフェースAnnotatedElement
      型パラメータ:
      T - 照会し、直接存在する場合に返す注釈の型。
      パラメータ:
      annotationClass - 注釈型に対応するClassオブジェクト
      戻り値:
      直接存在する場合は、この要素の指定された注釈型の注釈。そうでない場合はnull
      例外:
      NullPointerException - 指定された注釈クラスがnullの場合
      導入されたバージョン:
      1.8
    • getDeclaredAnnotationsByType

      public <T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass)
      直接存在する間接的に存在する場合は、この要素の指定された型の注釈を返します。 このメソッドは継承された注釈を無視します。 この要素に直接または間接的に存在する指定された注釈がない場合、戻り値は長さ0の配列です。 このメソッドとAnnotatedElement.getDeclaredAnnotation(Class)の違いは、引数が「繰返し可能な注釈タイプ」 (JLS 9.6)であるかどうかをこのメソッドが検出し、ある場合は"検索"がコンテナ注釈(存在する場合)を検出しようとする点です。 このメソッドの呼出し元は、返された配列を自由に変更することができ、これはほかの呼出し元に返された配列に影響を及ぼしません。

      このメソッドによって返される注釈は宣言注釈であることに注意してください。

      定義:
      getDeclaredAnnotationsByType、インタフェースAnnotatedElement
      型パラメータ:
      T - 照会し、直接または間接的に存在する場合に返す注釈の型。
      パラメータ:
      annotationClass - 注釈型に対応するClassオブジェクト
      戻り値:
      この要素に直接または間接的に存在する場合は、この要素の指定された注釈型のすべての注釈。そうでない場合は長さ0の配列
      例外:
      NullPointerException - 指定された注釈クラスがnullの場合
      導入されたバージョン:
      1.8
    • getDeclaredAnnotations

      public Annotation[] getDeclaredAnnotations()
      この要素に直接存在する注釈を返します。 このメソッドは継承された注釈を無視します。 この要素に直接存在する注釈がない場合、戻り値は長さ0の配列です。 このメソッドの呼出し元は、返された配列を自由に変更することができ、これはほかの呼出し元に返された配列に影響を及ぼしません。

      このメソッドによって返される注釈は宣言注釈であることに注意してください。

      定義:
      getDeclaredAnnotations、インタフェースAnnotatedElement
      実装要件:
      デフォルトの実装ではUnsupportedOperationExceptionがスローされます。サブクラスはこのメソッドをオーバーライドする必要があります。
      戻り値:
      この要素に直接存在する注釈
      導入されたバージョン:
      1.5