5

私はリフレクションに非常に慣れていないので、次のような疑問があります。

public void setAccessible(boolean flag) throws SecurityException

このメソッドには、boolen任意のフィールドまたはメソッドの新しいアクセシビリティを示すパラメーター フラグがあります。
たとえば、privateクラスの外部からクラスのメソッドにアクセスしようとする場合、 を使用してメソッドをフェッチしgetDeclaredMethod、アクセシビリティを として設定するとtrue、次のように呼び出すことができますmethod.setAccessible(true);
。メソッドがあり、アクセシビリティを false に設定しmethod.setAccessible(false);た場合に使用できます。publicしかし、その必要性は何ですか?私の理解は明確ですか?
を使用しない場合は、method.setAccessible(false)次のようにメソッド シグネチャを変更できます。

public void setAccessible() throws SecurityException
4

3 に答える 3

18

setAccessible(false)おそらく、あなたはあなたの人生で決してすることはありません。これは、setAccessible がメンバーの可視性を永続的に変更しないためです。元のソースのメソッドがprivateであっても、このインスタンスでmethod.setAccessible(true)後続の呼び出しを行うことが許可されているような場合。 method

たとえば、次のように考えてください。

A.java
*******
public class A
{
   private void fun(){
     ....
   }
}

B.java
***********
public class B{

   public void someMeth(){
       Class clz = A.class; 
       String funMethod = "fun";

       Method method = clz.getDeclaredMethod(funMethod);
       method.setAccessible(true);

       method.invoke(); //You can do this, perfectly legal;

       /** but you cannot do this(below), because fun method's visibilty has been 
           turned on public only for the method instance obtained above **/

       new A().fun(); //wrong, compilation error

       /**now you may want to re-switch the visibility to of fun() on method
          instance to private so you can use the below line**/

      method.setAccessible(false);

      /** but doing so doesn't make much effect **/

  }

}

于 2013-04-26T07:29:46.740 に答える
4

Field.setAccessible(true),シナリオ: read it でプライベート フィールドから保護を削除し、フィールドを元の状態に戻しました。Field.setAccessible(false).

于 2013-04-26T07:11:22.317 に答える
0
//create class PrivateVarTest { private abc =5; and private getA() {sop()}} 


import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class PrivateVariableAcc {

public static void main(String[] args) throws Exception {
    PrivateVarTest myClass = new PrivateVarTest();

    Field field1 = myClass.getClass().getDeclaredField("a");

    field1.setAccessible(true);

    System.out.println("This is access the private field-"
            + field1.get(myClass));

    Method mm = myClass.getClass().getDeclaredMethod("getA");

    mm.setAccessible(true);
    System.out.println("This is calling the private method-"
            + mm.invoke(myClass, null));

}

}
于 2013-11-23T09:49:28.340 に答える