如何从不完整的类名中获取实例化对象?

时间:2011-04-01 12:47:56

标签: java constructor classloader

世界!我需要从其类的名称实例化一个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();
}       

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

2 个答案:

答案 0 :(得分: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(...)或等效。

之前

答案 1 :(得分:1)

重复尝试使用包搜索路径。 ;)

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