2012-08-13 62 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