##なんか不思議でおもしろいぞこれ
Reflection.java
package reflection;
import java.lang.reflect.Method;
public class Reflection {
private static <T> void test(Class<T> t) {
try {
// インスタンスを取得
Object instance = t.newInstance();
// メソッドを取得
Method method = t.getMethod("test", String.class);
// メソッド実行
method.invoke(instance, "わっほい");
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
test(ReflectionTest.class);
}
}
class ReflectionTest {
public void test(String str) {
System.out.println(str);
}
}
結果
わっほい
とまぁ、なんだろう
リモートでPCにアクセスする感じで
クラスにアクセスして、メソッドをアクセスして みたいな
これを使えばprivateメソッドとかも実行できちゃうらしいです
やってみよう
privateにしてみた.java
class ReflectionTest {
private void test(String str) {
System.out.println(str);
}
}
結果
java.lang.NoSuchMethodException: reflection.ReflectionTest.test(java.lang.String)
at java.lang.Class.getMethod(Unknown Source)
at reflection.Reflection.test(Reflection.java:14)
at reflection.Reflection.main(Reflection.java:25)
だめじゃん!!!うそつき!!!
これが必要らしい.java
package reflection;
import java.lang.reflect.Method;
public class Reflection {
private static <T> void test(Class<T> t) {
try {
// インスタンスを取得
Object instance = t.newInstance();
// メソッドを取得
Method method = t.getDeclaredMethod("test", String.class);
// privateの場合, アクセスしますよ宣言が必要
method.setAccessible(true);
// メソッド実行
method.invoke(instance, "わっほい");
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
test(ReflectionTest.class);
}
}
class ReflectionTest {
@SuppressWarnings("unused")
private void test(String str) {
System.out.println(str);
}
}
Method
クラスのsetAccessible
メソッドでtrue
を設定しなきゃだめらしいですね
まぁこいつはtestクラスとかでもprivateにアクセスしたりとか
なんかこう強引になんでもできるみたいな
ただよくわからんReflectiveOperationException
とかいうようわからん例外もある上に
少し間違えるとすぐいろんな例外とぶんで
んまぁもうほんと力業ですねぇ