gpt4 book ai didi

java - 迭代类映射并调用

转载 作者:行者123 更新时间:2023-11-30 08:03:21 25 4
gpt4 key购买 nike

此处的 invoke() 错误为:java.lang.ClassNotFoundException: class HelloWorld$Foo,我不清楚原因。我还不得不求助于获取字符串 .class.toString() 而不是直接使用 .class

如果不能避免 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!"; }
}
}

最佳答案

FooHelloWorld 的内部类因此必须由 HelloWorld 的实例创建.尝试 public static class Foo ...相反。

如果Foo需要是一个内部类(即不是 static ),你需要调用相应的构造函数,例如像这样:

Foo.class.getConstructor(  HelloWorld.class ).newInstance( new HelloWorld() );

请注意,以上是示例,因此您可能会使用 clazz.getConstructor(...) .但是,请注意,在这种情况下,如果 Bar是一个静态的“内部”类,该类没有这样的构造函数。因此,如果类不同,您必须检查哪些构造函数可用。

还有 Class<?> clazz = myMap.get(name);就足够了。

旁注:您不需要在循环中进行查找,只需遍历 map 的条目集即可。此外,由于您创建了 clazz 的实例你不需要调用foobar.getClass()但可以使用 clazz直接。

for(Map.Entry<String, Class> entry : myMap.entrySet()){
Class<?> clazz = entry.getValue();
Object foobar = ...;
System.out.println("name: " + entry.getKey() + " goes " + clazz.getMethod("chirp").invoke(foobar));
}

关于java - 迭代类映射并调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36335932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com