我試圖做使用Class c = Class.forName(className)
沒有限定名稱
我想在className
通過不指定程序包名稱爲字符串className
將包含多個子包中的類Java反射Java反射說com.A.*
,com.B.*
。 ... com.Z.*
這可能嗎?
如果我在這種情況下有很多子包,那麼做一個事件切換來預先分配不同的子包是不可行的。
我試圖做使用Class c = Class.forName(className)
沒有限定名稱
我想在className
通過不指定程序包名稱爲字符串className
將包含多個子包中的類Java反射Java反射說com.A.*
,com.B.*
。 ... com.Z.*
這可能嗎?
如果我在這種情況下有很多子包,那麼做一個事件切換來預先分配不同的子包是不可行的。
首先,讓所有類與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);
你不覺得你是不必要地實例化那些不需要的類嗎? – Abilash 2013-04-03 01:28:36
小心碰撞。 'classBySimpleName.get(「List」)'隨機返回'java.util.List'或'javax.swing.List' – 2015-04-20 11:13:27
從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.
一個簡單的辦法是有候選人軟件包的列表:
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
)如果找不到類,它們不會拋出異常。
當然我沒有注意到允許您找到類別而沒有指定一個名稱。
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./
}
}
請避免代碼只回答。至少提供一個介紹性文字來解釋它... – 2017-08-30 13:08:35
感謝您使用此代碼段,它可能會提供一些即時幫助。通過展示*爲什麼*這是一個很好的解決方案,對未來的讀者會有更好的解決方案,這將爲它的教育價值提供一個合適的解釋[//大大提高](// meta.stackexchange.com/q/114762)但不完全相同的問題。請編輯您的答案以添加解釋,並指出適用的限制和假設。 – 2017-08-30 17:14:37
@Leonardo Alves Machado我編輯了答案,好心一看。 – 2017-08-31 05:24:17
的className只能包含一個完全合格的類。它不能以'*'結尾。我可能會誤解你的意圖,你能否詳細說明一些例子? – 2012-08-13 07:21:20
@HieryNomus我沒有用'*'結尾。 Jus有類可以從**不同的**子包中反映出來。 – humansg 2012-08-13 07:25:24
這是不可能的,但你甚至會如何定義它的語義?例如,'Class.forName(「Date」)'會做什麼? (JDK中有兩個簡單名稱爲「Date」的類。) – yshavit 2012-08-13 07:25:38