Java 如何使用字符串调用类
大家好,我想知道如何使用字符串项调用一个类Java 如何使用字符串调用类,java,string,class,Java,String,Class,大家好,我想知道如何使用字符串项调用一个类 class A { String[] des = { "hi" }; } class Example { public static void main(String[] args) { String[] className = { "A", "B" }; System.out.println(className.des[0]); // i wanted to call des array in
class A {
String[] des = { "hi" };
}
class Example {
public static void main(String[] args) {
String[] className = { "A", "B" };
System.out.println(className.des[0]); // i wanted to call des array in
// a class with index equal to 0
}
}
从上面可以看出,我希望在运行时使用字符串内容作为类调用方。是否可能…(我必须使用字符串)您的代码没有多大意义,因为
des
不是String
数组className
的字段。但是,看起来您正试图访问classa
中声明的字段,因为类的名称仅为字符串
值。由于des
是一个实例字段,因此需要使用A
的实例。您可以这样做:
A a = (A) (Class.forName("A").newInstance());
System.out.println(a.des[0]);
您必须添加代码来处理可能引发的潜在异常。还要注意,Class.forName
的参数必须是类的全名,因此如果A
是包的一部分(比如com.example
),那么它必须是Class.forName(“com.example.A”)
下面是如何将Sotirios Delimanolis和我的代码组合成一个完整的工作示例:
class Example {
static class A {
String[] des = { "Hi from class A" };
}
static class B {
String[] des = { "Hi from Class B" };
}
public static void main(String[] args) {
String[] classNames = { "Example$A", "Example$B" }; // inner class names
for (String name : classNames) {
try {
System.out.println(getDes0(name));
} catch (Exception e) {
System.err.println("Could not get des[0] for class " + name);
e.printStackTrace();
}
}
}
private static String getDes0(String className)
throws Exception // better to be explicit, but distracts from the answer
{
Class<?> cls = Class.forName(className);
Field field = cls.getDeclaredField("des");
Object obj = cls.newInstance();
String[] des = (String[]) field.get(obj);
return des[0];
}
}
类示例{
静态A类{
字符串[]des={“Hi from class A”};
}
静态B类{
字符串[]des={“Hi from Class B”};
}
公共静态void main(字符串[]args){
String[]classNames={“Example$A”,“Example$B”};//内部类名
for(字符串名称:类名){
试一试{
System.out.println(getDes0(name));
}捕获(例外e){
System.err.println(“无法获取类“+name”的des[0];
e、 printStackTrace();
}
}
}
私有静态字符串getDes0(字符串类名称)
抛出异常//最好是明确的,但会分散对答案的注意力
{
Class cls=Class.forName(className);
字段字段=cls.getDeclaredField(“des”);
Object obj=cls.newInstance();
String[]des=(String[])field.get(obj);
返回des[0];
}
}
我会后悔把这个给你看,只是为了好玩
String className = "A"; // use the fully qualified name
Class clazz = Class.forName(className);
Field field = clazz.getDeclaredField("des");
field.setAccessible(true);
A a = new A(); // if you don't know the actual type, you can declare it as Object and get it from somewhere
String[] des = (String[])field.get(a);
System.out.println(des[0]);
显然,所有的异常处理都是相应的。使用反射,尽管这不是您想要的。在继续之前,你可能需要检查Java语法。你能告诉我使用代码请不要编辑,如果没有得到qus。请我想动态地给出名称,如果我已经知道它是类“A”,为什么我要使用这个。方法。huhMy代码用于动态地调用类,正如你在本文中所建议的,我仍然需要调用将类名指定为“A”,因此没有意义,所以我想只使用字符串名作为我的类名来解析des…@user2829506如果你不知道类名,你怎么能期望知道字段名或如何将其用作
字符串[]
?关于更多信息,des位于不同的类中,我尝试动态调用这些类……好吧,这就像三个具有相同代码但名称不同的类,例如三个类是“Cat”“dog”“Rat”,它们都具有相同的数组--run[]--所以我知道每个类中都有run,但我想使用String通过循环逐个访问它们,所以我的数组字符串[]className={“Dog”,Rat,Cat”};我想访问每个类中的run[k],这样一个假想的命令可以像className[0]一样。run[0]要访问运行数组的类dog和索引0。。。Thanks@user2829506-啊。在这种情况下,您可能需要使用反射API来访问该字段。我认为演示了如何执行此操作(除了您可以使用clazz.getInstance()
来获取实例,而不是new A()
)。您可以使用Object A=clazz.getInstance()
获取一个实例,而不是A=new A()
。代码不需要依赖于实际的类(根据OP,这会有所不同)。@TedHopp是的,在你回答的注释之后,实际的对象可以来自一些外部源。我在代码段中添加了注释。谢谢。