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

クラスAccessibleObject

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

    public class AccessibleObject
    extends Object
    implements AnnotatedElement
    AccessibleObjectクラスは、FieldMethod、およびConstructorオブジェクト(「リフレクトされたオブジェクト」と呼ばれる)の基本クラスです。 それは、Java言語のアクセス制御が使用されているときの抑制チェックとして、リフレクトされたオブジェクトにフラグを立てる機能を提供します。 これにより、通常は禁止されるような方法でオブジェクトを操作するのに十分な特権を持つ洗練されたアプリケーション(Java Object Serializationやその他の永続化メカニズムなど)が可能になります。

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

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

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

    導入されたバージョン:
    1.2
    Java™言語仕様:
    6.6 アクセス制御
    • コンストラクタのサマリー

      コンストラクタ 
      修飾子 コンストラクタ 説明
      protected AccessibleObject()
      コンストラクタで、Java仮想マシンだけが使用します。
    • メソッドのサマリー

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

      • AccessibleObject

        protected AccessibleObject()
        コンストラクタで、Java仮想マシンだけが使用します。
    • メソッドの詳細

      • setAccessible

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

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

        セキュリティ・マネージャがある場合、そのcheckPermissionメソッドは最初にReflectPermission("suppressAccessChecks")パーミッションで呼び出されます。

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

        パラメータ:
        array - AccessibleObjectの配列
        flag - 各オブジェクトのaccessibleフラグの新しい値
        例外:
        InaccessibleObjectException - アレイ内のすべてのオブジェクトに対してアクセスを有効にできない場合
        SecurityException - リクエストがセキュリティ・マネージャによって拒否された場合、または配列内の要素が java.lang.Classのコンストラクタである場合
        関連項目:
        SecurityManager.checkPermission(java.security.Permission), ReflectPermission
      • 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が名前のないモジュールまたは開いているモジュールにあるときには常に成功します。

        このメソッドは、宣言クラスが呼び出し元とは異なるモジュールにあり、宣言クラスを含むパッケージが呼び出し元に対して開かれていない場合に、privateメンバー、デフォルト(package)アクセスを持つメンバー、保護されたインスタンス・メンバー、または保護されたコンストラクタ・モジュール。

        セキュリティ・マネージャがある場合、そのcheckPermissionメソッドは最初にReflectPermission("suppressAccessChecks")パーミッションで呼び出されます。

        パラメータ:
        flag - accessibleフラグの新しい値
        例外:
        InaccessibleObjectException - アクセスを有効にできない場合
        SecurityException - リクエストがセキュリティ・マネージャによって拒否された場合
        関連項目:
        trySetAccessible(), MethodHandles.privateLookupIn(java.lang.Class<?>, java.lang.invoke.MethodHandles.Lookup)
      • trySetAccessible

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

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

        たとえば、呼び出し側は、Methodオブジェクトが呼び出されたときにJava言語アクセス制御のチェックを抑制するために、MethodオブジェクトのtrySetAccessibleオブジェクトをプライベート・インスタンス・メソッドp.T::privateMethodに対して呼び出すことができます。 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
                 ...
             }
         

        セキュリティ・マネージャがある場合、そのcheckPermissionメソッドは最初にReflectPermission("suppressAccessChecks")パーミッションで呼び出されます。

        戻り値:
        accessibleフラグがtrueに設定されている場合、true; falseアクセスを有効にできない場合false
        例外:
        SecurityException - リクエストがセキュリティ・マネージャによって拒否された場合
        導入されたバージョン:
        9
        関連項目:
        MethodHandles.privateLookupIn(java.lang.Class<?>, java.lang.invoke.MethodHandles.Lookup)
      • 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を返します。

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

        public <T extends Annotation> T getAnnotation​(Class<T> annotationClass)
        インタフェースからコピーされた説明: AnnotatedElement
        存在する場合は、この要素の指定された型の注釈を返し、そうでない場合はnullを返します。
        定義:
        getAnnotation、インタフェース: AnnotatedElement
        型パラメータ:
        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)
        インタフェースからコピーされた説明: AnnotatedElement
        この要素に関連付けられている注釈を返します。 この要素に関連付けられている注釈がない場合、戻り値は長さ0の配列です。 このメソッドとAnnotatedElement.getAnnotation(Class)の違いは、このメソッドではその引数が繰返し可能な注釈型 (JLS 9.6)であるかどうかが検出され、繰返し可能な注釈型である場合は、コンテナ注釈を調べることで、その型の1つ以上の注釈の検索が試みられることです。 このメソッドの呼出し元は、返された配列を自由に変更することができ、これはほかの呼出し元に返された配列に影響を及ぼしません。
        定義:
        getAnnotationsByType、インタフェース: AnnotatedElement
        型パラメータ:
        T - 照会し、存在する場合に返す注釈の型。
        パラメータ:
        annotationClass - 注釈型に対応するClassオブジェクト
        戻り値:
        この要素に関連付けられている場合は、この要素の指定された注釈型のすべての注釈。そうでない場合は長さ0の配列
        例外:
        NullPointerException - 指定された注釈クラスがnullの場合
        導入されたバージョン:
        1.8
      • getAnnotations

        public Annotation[] getAnnotations()
        インタフェースからコピーされた説明: AnnotatedElement
        この要素に存在する注釈を返します。 この要素に存在する注釈がない場合、戻り値は長さ0の配列です。 このメソッドの呼出し元は、返された配列を自由に変更することができ、これはほかの呼出し元に返された配列に影響を及ぼしません。
        定義:
        getAnnotations、インタフェース: AnnotatedElement
        戻り値:
        この要素に存在する注釈
        導入されたバージョン:
        1.5
      • getDeclaredAnnotation

        public <T extends Annotation> T getDeclaredAnnotation​(Class<T> annotationClass)
        インタフェースからコピーされた説明: AnnotatedElement
        直接存在する場合は、この要素の指定された型の注釈を返し、そうでない場合はnullを返します。 このメソッドは継承された注釈を無視します。 (この要素に直接存在する注釈がない場合は、nullを返します。)
        定義:
        getDeclaredAnnotation、インタフェース: AnnotatedElement
        型パラメータ:
        T - 照会し、直接存在する場合に返す注釈の型。
        パラメータ:
        annotationClass - 注釈型に対応するClassオブジェクト
        戻り値:
        直接存在する場合は、この要素の指定された注釈型の注釈。そうでない場合はnull
        例外:
        NullPointerException - 指定された注釈クラスがnullの場合
        導入されたバージョン:
        1.8
      • getDeclaredAnnotationsByType

        public <T extends Annotation> T[] getDeclaredAnnotationsByType​(Class<T> annotationClass)
        インタフェースからコピーされた説明: AnnotatedElement
        直接存在する間接的に存在する場合は、この要素の指定された型の注釈を返します。 このメソッドは継承された注釈を無視します。 この要素に直接または間接的に存在する指定された注釈がない場合、戻り値は長さ0の配列です。 このメソッドとAnnotatedElement.getDeclaredAnnotation(Class)の違いは、このメソッドではその引数が繰返し可能な注釈型 (JLS 9.6)であるかどうかが検出され、繰返し可能な注釈型である場合は、コンテナ注釈(存在する場合)を調べることで、その型の1つ以上の注釈の検索が試みられることです。 このメソッドの呼出し元は、返された配列を自由に変更することができ、これはほかの呼出し元に返された配列に影響を及ぼしません。
        定義:
        getDeclaredAnnotationsByType、インタフェース: AnnotatedElement
        型パラメータ:
        T - 照会し、直接または間接的に存在する場合に返す注釈の型。
        パラメータ:
        annotationClass - 注釈型に対応するClassオブジェクト
        戻り値:
        この要素に直接または間接的に存在する場合は、この要素の指定された注釈型のすべての注釈。そうでない場合は長さ0の配列
        例外:
        NullPointerException - 指定された注釈クラスがnullの場合
        導入されたバージョン:
        1.8
      • getDeclaredAnnotations

        public Annotation[] getDeclaredAnnotations()
        インタフェースからコピーされた説明: AnnotatedElement
        この要素に直接存在する注釈を返します。 このメソッドは継承された注釈を無視します。 この要素に直接存在する注釈がない場合、戻り値は長さ0の配列です。 このメソッドの呼出し元は、返された配列を自由に変更することができ、これはほかの呼出し元に返された配列に影響を及ぼしません。
        定義:
        getDeclaredAnnotations、インタフェース: AnnotatedElement
        戻り値:
        この要素に直接存在する注釈
        導入されたバージョン:
        1.5