2012-08-13 31 views
1

我試圖做使用Class c = Class.forName(className)沒有限定名稱

我想在className通過不指定程序包名稱爲字符串className將包含多個子包中的類Java反射Java反射說com.A.*com.B.*。 ... com.Z.*

這可能嗎?

如果我在這種情況下有很多子包,那麼做一個事件切換來預先分配不同的子包是不可行的。

+1

的className只能包含一個完全合格的類。它不能以'*'結尾。我可能會誤解你的意圖,你能否詳細說明一些例子? – 2012-08-13 07:21:20

+0

@HieryNomus我沒有用'*'結尾。 Jus有類可以從**不同的**子包中反映出來。 – humansg 2012-08-13 07:25:24

+0

這是不可能的,但你甚至會如何定義它的語義?例如,'Class.forName(「Date」)'會做什麼? (JDK中有兩個簡單名稱爲「Date」的類。) – yshavit 2012-08-13 07:25:38

回答

3

首先,讓所有類與Reflections

Reflections reflections = new Reflections(); 

Set<Class<?>> allClasses = reflections.getSubTypesOf(Object.class); 

接下來,建立一個查詢地圖。

// Doesn't handle collisions (you might want to use a multimap such as http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Multimap.html instead) 
Map<String, Class<?>> classBySimpleName = new HashMap<>(); 

for(Class<?> c : allClasses) { 
    classBySimpleName.put(c.getSimpleName(), c);   
} 

當你需要查找一個類,你會做:

Class<?> clazz = classBySimpleName.get(className); 
+2

你不覺得你是不必要地實例化那些不需要的類嗎? – Abilash 2013-04-03 01:28:36

+0

小心碰撞。 'classBySimpleName.get(「List」)'隨機返回'java.util.List'或'javax.swing.List' – 2015-04-20 11:13:27

0

從java.lang.Class的javadoc的它不可能

public static Class<?> forName(String className) 
        throws ClassNotFoundException 

Parameters: 
className - the fully qualified name of the desired class. 
Returns: 
the Class object for the class with the specified name. 
8

一個簡單的辦法是有候選人軟件包的列表:

for (String pkg : packages) { 
    String fullyQualified = pkg + "." + className; 
    try { 
     return Class.forName(fullyQualified); 
    } catch (ClassNotFoundException e) { 
     // Oops. Try again with the next package 
    } 
} 

這會不會是最好的代碼在世界上,誠然...

可能可以通過尋找其他呼叫(例如, ClassLoader.getResource)如果找不到類,它們不會拋出異常。

當然我沒有注意到允許您找到類別而沒有指定一個名稱。

-1
import com.bvs.copy.UserEffitrac; 

public class TestCopy { 
    public static void main(String[] args) { 

    /* Make object of your choice ans assign it to 
     Object class reference */ 
     Object obj = new UserEffitrac(); 

    /* Create a Class class object */ 
     Class c = obj.getClass(); 
    /* getSimpleName() gives UserEffitrac as output */ 
     System.out.println(c.getName()); 
     /*getName() or getConicalName() will give complete class name./ 
    } 
} 
+4

請避免代碼只回答。至少提供一個介紹性文字來解釋它... – 2017-08-30 13:08:35

+0

感謝您使用此代碼段,它可能會提供一些即時幫助。通過展示*爲什麼*這是一個很好的解決方案,對未來的讀者會有更好的解決方案,這將爲它的教育價值提供一個合適的解釋[//大大提高](// meta.stackexchange.com/q/114762)但不完全相同的問題。請編輯您的答案以添加解釋,並指出適用的限制和假設。 – 2017-08-30 17:14:37

+0

@Leonardo Alves Machado我編輯了答案,好心一看。 – 2017-08-31 05:24:17