【问题标题】:how to use reflection package to create an object from a classpath如何使用反射包从类路径创建对象
【发布时间】:2010-12-13 20:34:41
【问题描述】:

我想创建一个我只知道它的类路径的对象 任何帮助将不胜感激。

【问题讨论】:

  • 您能澄清一下您所说的“我只知道它的类路径吗?” 您到底需要处理哪些信息?也为@BalusC 的评论 +1。
  • “类路径”到底是什么意思? java.lang.String 中的全限定类名或java.net.URL 中的类路径位置(由ClassLoader#getResource() 获得)或java.io.File 中的绝对文件路径?
  • 类路径?如果您的意思是“org.mycompany.FirstClass”,那么您就可以开始了!这种字符串称为完全限定名。

标签: java reflection


【解决方案1】:

如果您在 String 中有完整的限定类名,请使用 Class#forName()Class#newInstance()

Object o = Class.forName("com.example.Foo").newInstance();

然而,这要求类已经存在于类路径中并且具有(隐式)默认构造函数。

如果不是,并且您在URL 中有类的位置,则使用URLClassLoader 并将其传递给另一个接受它作为参数的Class#forName() 方法。

URL url = getItSomehow();
URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { url });
Object o = Class.forName("com.example.Foo", true, classLoader).newInstance();

或者,如果您将其放在 File 中,则先将其转换为 URL

File file = getItSomehow();
URL url = file.toURI().toURL();
// Continue with URLClassLoader.

【讨论】:

  • 好的,但是如果我想调用任何属于该类的方法,我知道它的路径或限定名
  • 这是一个不同的问题,所以这里只是一个教程链接而不是答案:download.oracle.com/javase/tutorial/reflect/member/… 如果你卡住了,请按右上角的 按钮。不要忘记包含有关您所坚持的特定步骤的详细信息,最好附带一个小代码 sn-p 可以准确重现您的问题。小心选择和使用正确的术语。术语“类路径”显然不是你想象的那样:)
  • 好的,但我想澄清一下,在我的项目中,我有 3 个包和 3 个类,我希望在第 4 个包和第 4 个类中实例化 3 个包中的三个类之一的对象来自用户的输入。
  • 是的,我已经猜到了类似的事情。我的回答的第一点就适用了。
  • 但我仍然必须检查类 'o' 是否是三个类之一,或者换句话说,对三个类重复代码 3 次。我使用反射来获得最佳解决方案本案
【解决方案2】:

你是这个意思吗?

Class c = Class.forName("java.lang.String");

【讨论】:

    猜你喜欢
    • 2023-02-14
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 2019-11-02
    • 2012-05-15
    • 2017-03-29
    • 2014-07-16
    • 1970-01-01
    相关资源
    最近更新 更多