facebook twitter hatena line email

「Java/reflection」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(ページの作成:「==reflectionとは== privateのプロパティやメソッドにアクセスする ==reflectionサンプル== 参考:https://qiita.com/ohke/items/b096c5cb9d2932764f22」)
 
 
(同じ利用者による、間の5版が非表示)
行1: 行1:
 
==reflectionとは==
 
==reflectionとは==
 
privateのプロパティやメソッドにアクセスする
 
privateのプロパティやメソッドにアクセスする
 +
 +
proguardが効いてる場合はprivateへアクセスできないので、その場合は、使えないことに注意。
  
 
==reflectionサンプル==
 
==reflectionサンプル==
 +
 +
===通常アクセス===
 +
<pre>
 +
Animal.java
 +
public class Animal {
 +
    public String name = "animal";
 +
    public int foot = 4;
 +
    public int getFoot() {
 +
        return foot;
 +
    }
 +
}
 +
</pre>
 +
main.java
 +
<pre>
 +
Animal animal = new Animal();
 +
Log.i(TAG, "name=" + animal.name); // animal
 +
Log.i(TAG, "foot=" + animal.foot); // 4
 +
Log.i(TAG, "getFoot=" + animal.getFoot()); // 4
 +
</pre>
 +
 +
===reflectionでprivateプロパティアクセス===
 +
Animal.java
 +
<pre>
 +
public class Animal {
 +
    private String name = "animal";
 +
    private int foot = 4;
 +
}
 +
</pre>
 +
main.java
 +
<pre>
 +
try {
 +
  Animal animal = new Animal();
 +
  Class animalClass = animal.getClass();
 +
  Field nameField = animalClass.getDeclaredField("name");
 +
  Field footField = animalClass.getDeclaredField("foot");
 +
  nameField.setAccessible(true);
 +
  footField.setAccessible(true);
 +
  Log.i(TAG, "nameField=" + (String)nameField.get(animal)); // animal
 +
  Log.i(TAG, "footField=" + (int)footField.get(animal)); // 4
 +
} catch (NoSuchFieldException e) {
 +
    e.printStackTrace();
 +
} catch (IllegalAccessException e) {
 +
    e.printStackTrace();
 +
} catch (SecurityException e) {
 +
    e.printStackTrace();
 +
} catch (IllegalArgumentException e) {
 +
    e.printStackTrace();
 +
} catch (NoSuchMethodException e) {
 +
    e.printStackTrace();
 +
} catch (InvocationTargetException e) {
 +
    e.printStackTrace();
 +
}
 +
</pre>
 +
 +
===reflectionでprivateのメソッドにアクセス===
 +
Animal.java
 +
<pre>
 +
public class Animal {
 +
    private String name = "animal";
 +
    private int foot = 4;
 +
    private int getFoot() {
 +
        return foot;
 +
    }
 +
}
 +
</pre>
 +
main.java
 +
<pre>
 +
try {
 +
  Animal animal = new Animal();
 +
  Class animalClass = animal.getClass();
 +
  Method method = animalClass.getDeclaredMethod("getFoot");
 +
  method.setAccessible(true);
 +
  Log.i(TAG, "getFootField=" +  (int)method.invoke(animal)); // 4
 +
} catch (NoSuchFieldException e) {
 +
    e.printStackTrace();
 +
} catch (IllegalAccessException e) {
 +
    e.printStackTrace();
 +
} catch (SecurityException e) {
 +
    e.printStackTrace();
 +
} catch (IllegalArgumentException e) {
 +
    e.printStackTrace();
 +
} catch (NoSuchMethodException e) {
 +
    e.printStackTrace();
 +
} catch (InvocationTargetException e) {
 +
    e.printStackTrace();
 +
}
 +
</pre>
 +
  
 
参考:https://qiita.com/ohke/items/b096c5cb9d2932764f22
 
参考:https://qiita.com/ohke/items/b096c5cb9d2932764f22

2019年6月18日 (火) 18:17時点における最新版

reflectionとは

privateのプロパティやメソッドにアクセスする

proguardが効いてる場合はprivateへアクセスできないので、その場合は、使えないことに注意。

reflectionサンプル

通常アクセス

Animal.java
public class Animal {
    public String name = "animal";
    public int foot = 4;
    public int getFoot() {
        return foot;
    }
}

main.java

Animal animal = new Animal();
Log.i(TAG, "name=" + animal.name); // animal
Log.i(TAG, "foot=" + animal.foot); // 4
Log.i(TAG, "getFoot=" + animal.getFoot()); // 4

reflectionでprivateプロパティアクセス

Animal.java

public class Animal {
    private String name = "animal";
    private int foot = 4;
}

main.java

try {
  Animal animal = new Animal();
  Class animalClass = animal.getClass();
  Field nameField = animalClass.getDeclaredField("name");
  Field footField = animalClass.getDeclaredField("foot");
  nameField.setAccessible(true);
  footField.setAccessible(true);
  Log.i(TAG, "nameField=" + (String)nameField.get(animal)); // animal
  Log.i(TAG, "footField=" + (int)footField.get(animal)); // 4
} catch (NoSuchFieldException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (SecurityException e) {
    e.printStackTrace();
} catch (IllegalArgumentException e) {
    e.printStackTrace();
} catch (NoSuchMethodException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    e.printStackTrace();
}

reflectionでprivateのメソッドにアクセス

Animal.java

public class Animal {
    private String name = "animal";
    private int foot = 4;
    private int getFoot() {
        return foot;
    }
}

main.java

try {
  Animal animal = new Animal();
  Class animalClass = animal.getClass();
  Method method = animalClass.getDeclaredMethod("getFoot");
  method.setAccessible(true);
  Log.i(TAG, "getFootField=" +  (int)method.invoke(animal)); // 4
} catch (NoSuchFieldException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (SecurityException e) {
    e.printStackTrace();
} catch (IllegalArgumentException e) {
    e.printStackTrace();
} catch (NoSuchMethodException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    e.printStackTrace();
}


参考:https://qiita.com/ohke/items/b096c5cb9d2932764f22