-3

こんにちは皆さん、たとえば文字列アイテムを使用してクラスを呼び出す方法を知りたいです

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
    }
}

上記から、実行時に文字列コンテンツをクラス呼び出し元として使用したかったと解釈できます。それは可能ですか..(私はそれのために文字列を使用することにバインドされています)

4

2 に答える 2

1

は配列desのフィールドではないため、コードはあまり意味がありません。ただし、クラスの名前を値として持つだけで、クラスで宣言されたフィールドにアクセスしようとしているようです。はインスタンス フィールドであるため、操作するには のインスタンスが必要です。次のようなことができます。StringclassNameAStringdesA

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];
    }
}
于 2013-10-04T18:35:05.797 に答える
0

Ted Hopp のソリューションを使用します。

これをあなたに見せたことを後悔するつもりですが、ただのキックです

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]);

明らかに、それに応じてすべての例外処理を行います。

于 2013-10-04T18:38:49.387 に答える