ここでは、invoke()はエラー:java.lang.ClassNotFoundException: class HelloWorld$Foo
でエラーが発生しています。私も.class
を直接使用する代わりに文字列.class.toString()
を得ることに頼らざるを得ませんでした。クラスのマップを反復して呼び出します
toString()
コールを避けていない場合は、このメソッドを呼び出せますか?
import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.Map;
public class HelloWorld{
public static void main(String []args){
Map<String, Class> myMap = new HashMap<String, Class>();
myMap.put("foo", Foo.class);
myMap.put("bar", Bar.class);
try {
for(String name : myMap.keySet()){
Class<?> clazz = Class.forName(myMap.get(name).toString()); // do I need to go through string at all?
Object foobar = clazz.newInstance();
System.out.println("name: " + name + " goes " + foobar.getClass().getMethod("chirp").invoke(foobar));
}
} catch (Throwable e) {
System.err.println(e);
}
}
public abstract class Foobar {
abstract String chirp();
}
public class Foo extends Foobar {
public String chirp() { return "chirp-chirp!"; }
}
public class Bar extends Foobar {
public String chirp() {return "woof-woof!"; }
}
}
編集:完成答え:
import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.Map;
public class HelloWorld{
public static void main(String []args){
Map<String, Class> myMap = new HashMap<String, Class>();
myMap.put("foo", Foo.class);
myMap.put("bar", Bar.class);
try {
for(Map.Entry<String, Class> entry : myMap.entrySet()){
Class<?> clazz = entry.getValue();
Object foobar = clazz.getConstructor( HelloWorld.class).newInstance(new HelloWorld());;
System.out.println("name: " + entry.getKey() + " goes " + clazz.getMethod("chirp").invoke(foobar));
}
} catch (Throwable e) {
System.err.println(e);
}
}
public abstract class Foobar {
abstract String chirp();
}
public class Foo extends Foobar {
public String chirp() { return "chirp-chirp!"; }
}
public class Bar extends Foobar {
public String chirp() {return "woof-woof!"; }
}
}
ありがとうございます。 –