2011-04-01 89 views
3

世界!我需要从它的Class的名字实例化一个Object。我知道这是可能的,这样做如何从不完整的类名获取实例化对象?

MyObject myObject = null; 
try { 
    Constructor constructor = Class.forName("fully.qualified.class.name" ).getConstructor(); // Get the constructor without parameters 
    myObject = (MyObject) constructor.newInstance(); 
} catch (Exception e) { 
    e.printStackTrace(); 
}  

问题是,我的班的名字是不完全合格的。有没有办法通过只知道短名称来获得完整的名称?

+0

该课程是否已加载? B/c,那么你可以列出所有加载的类并与它们进行比较......但我必须问,为什么这是必要的?也许有一个更好的解决方案,以解决更高级别的问题 – 2011-04-01 13:02:13

回答

2
MyObject myObject = null; 
for (Package p : Package.getPackages()) { 
    try { 
     myObject = Class.forName(p.getName() + "." + className).newInstance(); 
     break; 
    } catch (ClassNotFoundException ex) { 
     // ignore 
    } 
} 

Package.getPackages()电话会给你每包知道当前类的ClassLoader 及其祖先

警告:这将是昂贵的,因为你反复抛出和捕捉异常。有可能通过测试加速它:

this.getClass().getClassLoader().findResource(binaryClassName) != null 

在致电Class.forName(...)或等效。

+0

好,谢谢!仅供参考,p.getName()和className之间缺少'+“。”'。 – tunnuz 2011-04-01 14:52:24

+0

谢谢 - 修复它 – 2011-04-01 14:56:59

1

对于包搜索路径反复尝试此操作。 ;)

String[] packages = ...; 
String className = ...; 
MyObject myObject = null; 
for(String p : packages) 
    try { 
    myObject = Class.forName(p + '.' + className).newInstance(); 
    break; 
    } catch (Exception ignored) { 
    } 
+0

这可能是完全按照要求完成的唯一方法,但我只会捕获特定的异常,即ClassNotFoundEx或任何....您不想隐藏其他问题... – 2011-04-01 13:03:47

+0

@Java Drinker,这是真的,如果一个失败的构造函数有副作用,你也可以得到副作用。以这种方式使用newInstance()的缺点之一是它也可能抛出CNFE。 (尽管相当偏执于担心),即这个newInstance()不包装检查的异常。 – 2011-04-01 13:06:37