「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日 (火) 09: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();
}