文字列からクラスタイプを取得する


83

私はStringクラスの名前が言う"Ex".class拡張子なし)を持っています。次のClassような変数に割り当てたいと思います。

Class cls = (string).class

どうやってやるの?


クラスが別のプロジェクトにある場合はどうなりますか?
スティーブン

あなたのコメントに:何!??? クラスが別のプロジェクトにあった場合、それはIDEに依存しませんか?アプリケーションに関する限り、ライブラリは外部から参照されているため、とにかく同じプロジェクトにあるかのようになります。同様に、Java APIクラスがプロジェクトに含まれていないことをご存知ですか?ただし、IDEが正しく設定されていれば、IDEのコンパイラはそれらの場所を認識しています。同じことが別のプロジェクトのクラスにも当てはまります。
user919860 2013年

回答:


165
Class<?> cls = Class.forName(className);

しかし、あなたclassNameは完全に資格を持っている必要があります-すなわちcom.mycompany.MyClass


2
そのスローするClassNotFound例外
Steven

1
次に、クラスがクラスパス上にないか、完全修飾クラス名を渡していない(例:com.mycompany.project.ClassName
Hans Westerbeek

classNameあなたはどのような価値を渡していますか?クラスパスにそのようなクラスはありますか?
Bozho 2010

ええ、クラスは同じパッケージに含まれています
Steven

1
で同じ問題が発生しましたClassNotFoundException。秘訣は、try-catchで例外を処理することでした。このようなもの:try { Class<?> cls = Class.forName("com.company.MyClass"); } catch (ClassNotFoundException ex) { /* do something to handle the case when the string isn't valid and therefor the class can't be found */ }
kumaheiyama 2014年

43
String clsName = "Ex";  // use fully qualified name
Class cls = Class.forName(clsName);
Object clsInstance = (Object) cls.newInstance();

詳細については、ReflectionのJavaチュートリアルトレイル(http://java.sun.com/docs/books/tutorial/reflect/TOC.html)を確認してください。


3
ボゾの答えはもっとポイントがあるかもしれませんが、あなたの答えはもっと説明的だと思います。PS。なぜあなたの名前はJuanZeですか?ほとんどスペイン語と中国語のミックスのように聞こえます。:D。その背後にある種の賢い意味はありますか?
user919860 2013年

私はEclipseで動的Webプロジェクトを使用しています。上記のコードを使用してクラスをフェッチしています。ただし、次のような文字列変数を使用すると、ClassNotFoundExceptionが返されます。 String clsName = "com.mydoamin.className"; Class cls = Class.forName(clsName); 完全修飾クラス名をパラメーターとしてハードコードしている場合は、正常に機能します。なにか提案を?
Dibyanshu Jaiswal 2015年

8

次のforName方法を使用できますClass

Class cls = Class.forName(clsName);
Object obj = cls.newInstance();

私はEclipseで動的Webプロジェクトを使用しています。上記のコードを使用してクラスをフェッチしています。ただし、次のような文字列変数を使用すると、ClassNotFoundExceptionが返されます。 String clsName = "com.mydoamin.className"; Class cls = Class.forName(clsName); 完全修飾クラス名をパラメーターとしてハードコードしている場合は、正常に機能します。なにか提案を?
Dibyanshu Jaiswal 2015年

@djthequestclsName変数に完全修飾クラス名が含まれている場合、それを使用することとハードコードされた文字列に違いはありません。クラスパスに必要なクラスがない可能性があります。スタートアップコードの同じjarから共通のクラスをインスタンス化して、ライブラリがクラスローダーに存在することを確認すると役立つ場合があります。
rsp 2015

回答ありがとうございますが、文字列をハードコーディングすると変数の代わりにフィンが機能します。これは、クラスがクラスパスにあることを意味します。後で私が理解したように、Class.forName()メソッドはfinal変数を期待しています。単純な変数は機能しません。
Dibyanshu Jaiswal 2015

4

Java Reflection Conceptを使用して、実行時に任意のクラスのクラス参照を取得できます。

以下のコードを確認してください。以下に説明を示します

返されたクラスを使用してAClassのインスタンスを作成する1つの例を次に示します。

package com.xyzws;
class AClass {
    public AClass() {
        System.out.println("AClass's Constructor"); 
    }  
    static {   
        System.out.println("static block in AClass");  
    }
}
public class Program {   
    public static void main(String[] args) {
        try {       
            System.out.println("The first time calls forName:");   
            Class c = Class.forName("com.xyzws.AClass");      
            AClass a = (AClass)c.newInstance();    
            System.out.println("The second time calls forName:");  
            Class c1 = Class.forName("com.xyzws.AClass"); 
        } catch (ClassNotFoundException e) { 
            // ...
        } catch (InstantiationException e) {  
            // ...
        } catch (IllegalAccessException e) { 
            // ...
        }     
    }
}

印刷出力は

    The first time calls forName:
    static block in AClass
    AClass's Constructor
    The second time calls forName:

クラスはすでにロードされているため、2番目の「AClassの静的ブロック」はありません

説明は以下の通りです

Class.ForNameは、クラスオブジェクトを取得するために呼び出されます

クラスオブジェクトを使用して、クラスの新しいインスタンスを作成しています。

これについて疑問がある場合は私に知らせてください


クラスが別のプロジェクトにある場合はどうなりますか?
スティーブン

1
あなたはそのproectのjarファイルを取得し、クラス名にClass.forNameの(「oracle.jdbc.driver.OracleDriverと」)のようないくつかのことを指定することができます
gmhk


2

何を求めているのかわかりませんが... Class.forname、多分?


そのスローするClassNotFound例外
Steven

クラスが別のプロジェクトにある場合はどうなりますか?
スティーブン

1
誰もあなたの質問に答えていないようです。コンパイラがどこを見ればよいかを知っている限り、それが別のプロジェクトにあるかどうかは問題ではありません。おそらくIDEを使用しているので、おそらくIDEのみに依存します。参照については、Javaライブラリから参照するすべてのクラスがプロジェクトに含まれていないことをご存知ですか?ただし、コンパイラーは、それらが外部から参照されていることを知っているため、それらを探す場所を知っています。高度なJavaプログラミングを試みる場合は、基本的なJavaプログラミングを学ぶ必要があるようです。:|
user919860 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.