著作一覧 |
どうもすぐに忘れてしまうな。
プリミティブのClassインスタンスは、プリミティブクラスのTYPEスタティックフィールドだ。
intなら、Integer.TYPE。
Foo#bar(int, boolean);のメソッドを引っ張るには、Foo.class.getMethod("bar", new Class[] { Integer.TYPE, Boolean.TYPE });
と書けば良い。
import java.lang.reflect.*; public class Foo { public void bar(int n, boolean b) { System.out.println("n=" + n + ", b=" + b); } public static void main(String[] args) throws Exception { Method m = Foo.class.getMethod("bar", new Class[] { Integer.TYPE, Boolean.TYPE }); Foo f = new Foo(); m.invoke(f, new Object[] { new Integer(801), Boolean.FALSE }); } } => $ java Foo n=801, b=false
ちなみにC#だと何でもtypeofで取れるから覚えることはない。
using System; using System.Reflection; public class Foo { public void bar(int n, bool b) { System.Console.WriteLine("n=" + n + ", b=" + b); } public static void Main() { MethodInfo m = typeof(Foo).GetMethod("bar", new Type[] { typeof(int), typeof(bool) }); Foo f = new Foo(); m.Invoke(f, new Object[] { 801, false }); } }
なんて書いてからふと気付いてやってみると
import java.lang.reflect.*; public class Foo { public void bar(int n, boolean b) { System.out.println("n=" + n + ", b=" + b); } public static void main(String[] args) throws Exception { Method m = Foo.class.getMethod("bar", new Class[] { int.class, boolean.class }); Foo f = new Foo(); m.invoke(f, new Object[] { new Integer(801), Boolean.FALSE }); } }
なんのことはなく、int.class
とか書けるんじゃん。知らなかったよ。
良く見たらClass Literalsに記述があるな。
ジェズイットを見習え |