2010-12-13 47 views
0

我想创建一个对象,我只知道它的类路径 任何帮助将不胜感激。如何使用反射包从类路径创建对象

+1

你能澄清你的_什么意思_究竟是什么你需要使用哪些信息? +1 to @ BalusC的评论。 – 2010-12-13 20:38:55

+2

你对“classpath”有什么意思? java.lang.String中的全限定类名或者java.net.URL中的类路径位置(通过ClassLoader#getResource()获得)或者java.io中的绝对文件路径。 File'? – BalusC 2010-12-13 20:39:48

+0

类路径?如果你的意思是沿着“org.mycompany.FirstClass”这个句子,那么你应该走得很远!这种字符串被称为完全限定名称。 – Rekin 2010-12-13 20:40:26

回答

5

如果你有一个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. 
+0

好的,但是如果我想调用任何属于该类的方法,那我知道它的路径或限定名称 – 2010-12-13 20:55:00

+0

这是一个不同的问题,所以这里只是一个教程链接而不是答案:http://download.oracle。 com/javase/tutorial/reflect/member/methodInvocation.html如果你使用Stucks,请按右上方的Ask Question按钮。不要忘记包含关于您正在使用的特定步骤的详细信息,最好还有一小段代码片段,其中重现了您的问题。选择和使用正确的术语时要小心。 “classpath”这个词显然不是你认为的:) – BalusC 2010-12-13 20:55:55

+0

好的,但我想澄清一下,在我的项目中,我有3个包,3个类我想在第四个包和第四个类中实例化一个对象根据用户的输入,3个包中有三个类。 – 2010-12-13 21:10:40

1

您的意思是?

Class c = Class.forName("java.lang.String"); 
相关问题