我有一個String
,它有一個類的名稱,說"Ex"
(沒有.class
擴展名)。我想將它分配給一個變量Class
,像這樣:從字符串獲取類的類型
Class cls = (string).class
我怎樣才能做到這一點?
我有一個String
,它有一個類的名稱,說"Ex"
(沒有.class
擴展名)。我想將它分配給一個變量Class
,像這樣:從字符串獲取類的類型
Class cls = (string).class
我怎樣才能做到這一點?
不知道你在問什麼,但是...... Class.forname,也許?
其投擲ClassNotFound異常 – Steven 2010-03-09 12:12:10
如果類是在不同的項目? – Steven 2010-03-09 12:26:23
我看到沒有人回答你的問題。只要編譯器知道在哪裏尋找,它應該在另一個項目中就不重要了。因爲,你可能使用IDE,它可能完全取決於IDE。 關於引用的事情,你知道從Java庫引用的所有類都不在你的項目中,對吧?但是,編譯器知道在哪裏尋找它們,因爲它知道它們是在外部引用的。 當您嘗試進行高級Java編程時,您似乎需要學習基本的Java編程。 :| – user919860 2013-01-16 17:11:56
您可以使用Class
的forName
方法:
Class cls = Class.forName(clsName);
Object obj = cls.newInstance();
我正在使用eclipse中的Dynamic web項目。我正在使用上面的代碼來獲取一個類。但它返回ClassNotFoundException,當我使用像這樣的字符串變量: 'String clsName =「com.mydoamin.className」; 類CLS =的Class.forName(clsName);' 如果是硬編碼的完全合格的類名作爲參數然後東西很好地工作。任何建議? – 2015-11-25 04:55:29
@djthequest如果我們的'clsName'變量包含完全限定的類名,那麼在使用它和硬編碼字符串之間應該沒有區別。您可能沒有在classpath中需要的類。它可能有助於在啓動代碼中從同一個jar中實例化一個通用類,以確保該類庫存在於類加載器中。 – rsp 2015-12-01 09:43:04
感謝您的迴應,但是如果我對字符串進行硬編碼,而不是變量,那就意味着類在類路徑中,對吧?後來我發現,'Class.forName()'方法需要一個'final'變量。一個簡單的變量將不起作用。 – 2015-12-03 06:01:31
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進一步的細節。
Bozho的答案可能有更多的觀點,但我認爲你的描述更具描述性。 PS。你爲什麼叫JuanZe?幾乎聽起來像西班牙語和中國人之間的混合。 :d。背後有沒有某種巧妙的含義? – user919860 2013-01-16 17:09:55
@ user919860,您需要反向閱讀。 – Pacerier 2014-08-22 13:14:13
我正在使用eclipse中的Dynamic web項目。我正在使用上面的代碼來獲取一個類。但它返回ClassNotFoundException,當我使用像這樣的字符串變量: 'String clsName =「com.mydoamin.className」; 類CLS =的Class.forName(clsName);' 如果是硬編碼的完全合格的類名作爲參數然後東西很好地工作。任何建議? – 2015-11-25 04:58:06
您可以在運行時通過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調用來獲得一個類的對象
通過使用類對象,我們正在創建類的新實例。
對此的任何疑惑讓我知道
如果班級在不同的項目中,該怎麼辦? – Steven 2010-03-09 12:25:34
給你的評論:什麼!? 如果你的課程在一個不同的項目中,那麼它不會取決於你的IDE?就你的應用而言,它就好像它在同一個項目中一樣,因爲它的庫是在外部引用的。就像,你知道Java API類不在你的項目中,對嗎?但是,如果您的IDE設置正確,則IDE的編譯器知道在哪裏可以找到它們。這同樣適用於來自另一個項目的類。 – user919860 2013-01-16 17:12:33