Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用字符串调用类_Java_String_Class - Fatal编程技术网

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
的字段。但是,看起来您正试图访问class
a
中声明的字段,因为类的名称仅为
字符串
值。由于
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是的,在你回答的注释之后,实际的对象可以来自一些外部源。我在代码段中添加了注释。谢谢。