「Java/reflection」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→reflectionでprivateプロパティアクセス) |
|||
(同じ利用者による、間の1版が非表示) | |||
行1: | 行1: | ||
==reflectionとは== | ==reflectionとは== | ||
privateのプロパティやメソッドにアクセスする | privateのプロパティやメソッドにアクセスする | ||
+ | |||
+ | proguardが効いてる場合はprivateへアクセスできないので、その場合は、使えないことに注意。 | ||
==reflectionサンプル== | ==reflectionサンプル== | ||
行70: | 行72: | ||
main.java | main.java | ||
<pre> | <pre> | ||
− | Animal animal = new Animal(); | + | try { |
− | Class animalClass = animal.getClass(); | + | Animal animal = new Animal(); |
− | Method method = animalClass.getDeclaredMethod("getFoot"); | + | Class animalClass = animal.getClass(); |
− | method.setAccessible(true); | + | Method method = animalClass.getDeclaredMethod("getFoot"); |
− | Log.i(TAG, "getFootField=" + (int)method.invoke(animal)); // 4 | + | 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> | </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(); }