我试图做使用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