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

发布于 2024-10-28 22:08:58 字数 388 浏览 1 评论 0原文

世界!我需要从其类的名称实例化一个对象。我知道可以这样做,这样的

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();
}       

问题是我的班级名称不完全限定。有没有办法只知道简称就得到完整的名字?

world! I need to instantiate an Object from the name of its Class. I know that it is possible to do it, this way

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();
}       

The problem is that the name of my class is not fully qualified. Is there a way to get the complete name by only knowing the short name?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

歌枕肩 2024-11-04 22:08:58
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(...) 或等效方法之前。

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

The Package.getPackages() call will give you every package known to the current classes ClassLoader and its ancestors.

Warning: this will be expensive because you are repeatedly throwing and catching exceptions. It may be possible to speed it up by testing:

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

before calling Class.forName(...) or the equivalent.

才能让你更想念 2024-11-04 22:08:58

重复尝试此操作以获取包搜索路径。 ;)

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

Try this repeatedly for a package search path. ;)

String[] packages = ...;
String className = ...;
MyObject myObject = null;
for(String p : packages)
  try {
    myObject = Class.forName(p + '.' + className).newInstance();
    break;
  } catch (Exception ignored) {
  } 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文