| 著作一覧 |
どうもすぐに忘れてしまうな。
プリミティブの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に記述があるな。
ジェズイットを見習え |