0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

リフレクションなるものを知った

Posted at

##なんか不思議でおもしろいぞこれ

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とかいうようわからん例外もある上に

少し間違えるとすぐいろんな例外とぶんで

んまぁもうほんと力業ですねぇ

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?