2010-03-09 105 views
57

我有一個String,它有一個類的名稱,說"Ex"(沒有.class擴展名)。我想將它分配給一個變量Class,像這樣:從字符串獲取類的類型

Class cls = (string).class 

我怎樣才能做到這一點?

+0

如果班級在不同的項目中,該怎麼辦? – Steven 2010-03-09 12:25:34

+0

給你的評論:什麼!? 如果你的課程在一個不同的項目中,那麼它不會取決於你的IDE?就你的應用而言,它就好像它在同一個項目中一樣,因爲它的庫是在外部引用的。就像,你知道Java API類不在你的項目中,對嗎?但是,如果您的IDE設置正確,則IDE的編譯器知道在哪裏可以找到它們。這同樣適用於來自另一個項目的類。 – user919860 2013-01-16 17:12:33

回答

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

但你className應該是完全合格的 - 即com.mycompany.MyClass

+2

其投擲ClassNotFound異常 – Steven 2010-03-09 12:11:36

+0

然後要麼這個類不在類路徑上,要麼你沒有傳遞完全限定的類名,例如com.mycompany.project.ClassName – 2010-03-09 12:14:16

+0

你傳遞了​​什麼'className'的值?你的類路徑中是否有這樣的類? – Bozho 2010-03-09 12:14:37

3

英皇酒店..的Class.forName(字符串類名)?

+0

你也可以爲子類做這個嗎? – Gobliins 2017-03-20 16:15:02

2

不知道你在問什麼,但是...... Class.forname,也許?

+0

其投擲ClassNotFound異常 – Steven 2010-03-09 12:12:10

+0

如果類是在不同的項目? – Steven 2010-03-09 12:26:23

+0

我看到沒有人回答你的問題。只要編譯器知道在哪裏尋找,它應該在另一個項目中就不重要了。因爲,你可能使用IDE,它可能完全取決於IDE。 關於引用的事情,你知道從Java庫引用的所有類都不在你的項目中,對吧?但是,編譯器知道在哪裏尋找它們,因爲它知道它們是在外部引用的。 當您嘗試進行高級Java編程時,您似乎需要學習基本的Java編程。 :| – user919860 2013-01-16 17:11:56

6

您可以使用ClassforName方法:

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

我正在使用eclipse中的Dynamic web項目。我正在使用上面的代碼來獲取一個類。但它返回ClassNotFoundException,當我使用像這樣的字符串變量: 'String clsName =「com.mydoamin.className」; 類CLS =的Class.forName(clsName);' 如果是硬編碼的完全合格的類名作爲參數然後東西很好地工作。任何建議? – 2015-11-25 04:55:29

+0

@djthequest如果我們的'clsName'變量包含完全限定的類名,那麼在使用它和硬編碼字符串之間應該沒有區別。您可能沒有在classpath中需要的類。它可能有助於在啓動代碼中從同一個jar中實例化一個通用類,以確保該類庫存在於類加載器中。 – rsp 2015-12-01 09:43:04

+0

感謝您的迴應,但是如果我對字符串進行硬編碼,而不是變量,那就意味着類在類路徑中,對吧?後來我發現,'Class.forName()'方法需要一個'final'變量。一個簡單的變量將不起作用。 – 2015-12-03 06:01:31

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

檢查反思Java教程線索在http://java.sun.com/docs/books/tutorial/reflect/TOC.html進一步的細節。

+3

Bozho的答案可能有更多的觀點,但我認爲你的描述更具描述性。 PS。你爲什麼叫JuanZe?幾乎聽起來像西班牙語和中國人之間的混合。 :d。背後有沒有某種巧妙的含義? – user919860 2013-01-16 17:09:55

+0

@ user919860,您需要反向閱讀。 – Pacerier 2014-08-22 13:14:13

+0

我正在使用eclipse中的Dynamic web項目。我正在使用上面的代碼來獲取一個類。但它返回ClassNotFoundException,當我使用像這樣的字符串變量: 'String clsName =「com.mydoamin.className」; 類CLS =的Class.forName(clsName);' 如果是硬編碼的完全合格的類名作爲參數然後東西很好地工作。任何建議? – 2015-11-25 04:58:06

4

您可以在運行時通過Java Reflection Concept獲取任何類的Class引用。

檢查下面的代碼。下面 Explaianation給出下面是一個使用返回類創建ACLASS的一個實例,一個例子:

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 output is 
    The first time calls forName: 
    static block in AClass 
    AClass's Constructor 
    The second time calls forName: 
     //Calss has been loaded so there is not "static block in AClass" printing outThe second 

的Exaplaination低於

的Class.forName調用來獲得一個類的對象

通過使用類對象,我們正在創建類的新實例。

對此的任何疑惑讓我知道

+0

如果班級在不同的項目中,該怎麼辦? – Steven 2010-03-09 12:26:44

+1

你能得到該項目的jar文件,並指定類名 有些東西,如 Class.forName(「oracle.jdbc.driver.OracleDriver」) – gmhk 2010-03-09 13:30:35

相關問題