从字符串获取类类型


83

我有一个String带有类名称的名字"Ex"(无.class扩展名)。我想将其分配给Class变量,如下所示:

Class cls = (string).class

我怎样才能做到这一点?


如果班级在不同的项目中怎么办?
史蒂文

对您的评论:什么!如果您的课程在其他项目中,那么它不取决于您的IDE吗?就您的应用程序而言,因为它的库是在外部引用的,所以无论如何它似乎都在同一个项目中。就像,您知道Java API类不在您的项目中,对吗?但是,如果您的IDE设置正确,则IDE的编译器会知道在哪里可以找到它们。这同样适用于另一个项目中的类。
user919860 2013年

Answers:


165
Class<?> cls = Class.forName(className);

但是您className应该是完全合格的-即com.mycompany.MyClass


2
其引发的ClassNotFound异常
史蒂文

1
那么要么该类不在类路径中,要么您未传递完全限定的类名,例如com.mycompany.project.ClassName
Hans Westerbeek 2010年

className您传递的价值是什么?您的课程路径上有这样的课程吗?
博若

是的,班级在同一个包裹中
Steven

1
我也遇到同样的问题ClassNotFoundException。诀窍是在try-catch中处理异常。像这样的东西:try { Class<?> cls = Class.forName("com.company.MyClass"); } catch (ClassNotFoundException ex) { /* do something to handle the case when the string isn't valid and therefor the class can't be found */ }
kumaheiyama 2014年

43
String clsName = "Ex";  // use fully qualified name
Class cls = Class.forName(clsName);
Object clsInstance = (Object) cls.newInstance();

http://java.sun.com/docs/books/tutorial/reflect/TOC.html上查看Reflection上的Java Tutorial跟踪以了解更多详细信息。


3
博佐的答案可能有更多要点,但我认为您的描述更具描述性。PS。为什么叫胡安泽?几乎听起来像是西班牙语和汉语之间的混合体。:D。其背后是否有某种巧妙的含义?
user919860 2013年

我正在使用Eclipse中的Dynamic Web项目。我正在使用上面的代码来获取类。但是当我使用这样的字符串变量时,它返回ClassNotFoundException: String clsName = "com.mydoamin.className"; Class cls = Class.forName(clsName); 如果将完全限定的类名作为硬编码作为参数,则一切正常。有什么建议吗?
Dibyanshu Jaiswal 2015年

8

您可以使用以下forName方法Class

Class cls = Class.forName(clsName);
Object obj = cls.newInstance();

我正在使用Eclipse中的Dynamic Web项目。我正在使用上面的代码来获取类。但是当我使用这样的字符串变量时,它返回ClassNotFoundException: String clsName = "com.mydoamin.className"; Class cls = Class.forName(clsName); 如果将完全限定的类名作为硬编码作为参数,则一切正常。有什么建议吗?
Dibyanshu Jaiswal

@djthequest如果我们的clsName变量包含完全限定的类名,则使用它和硬编码字符串之间应该没有区别。您可能在类路径中没有所需的类。从启动代码中的同一jar实例化一个通用类可能有助于确保该库在类加载器中存在。
rsp 2015年

感谢您的回复,但是如果我对字符串进行硬编码而不是变量,则可以使用鳍,这意味着类位于类路径中,对吗?后来我想通了,Class.forName()方法需要一个final变量。一个简单的变量将不起作用。
Dibyanshu Jaiswal

4

您可以通过Java Reflection Concept在运行时获取任何类的Class引用。

检查以下代码。解释如下

这是一个使用返回的Class创建AClass实例的示例:

package com.xyzws;
class AClass {
    public AClass() {
        System.out.println("AClass's Constructor"); 
    }  
    static {   
        System.out.println("static block in AClass");  
    }
}
public class Program {   
    public static void main(String[] args) {
        try {       
            System.out.println("The first time calls forName:");   
            Class c = Class.forName("com.xyzws.AClass");      
            AClass a = (AClass)c.newInstance();    
            System.out.println("The second time calls forName:");  
            Class c1 = Class.forName("com.xyzws.AClass"); 
        } catch (ClassNotFoundException e) { 
            // ...
        } catch (InstantiationException e) {  
            // ...
        } catch (IllegalAccessException e) { 
            // ...
        }     
    }
}

打印输出为

    The first time calls forName:
    static block in AClass
    AClass's Constructor
    The second time calls forName:

该类已经加载,因此没有第二个“ AClass中的静态块”

解释如下

调用Class.ForName以获取一个Class对象

通过使用类对象,我们可以创建类的新实例。

任何对此的疑问让我知道


如果班级在不同的项目中怎么办?
史蒂文

1
您可以获取该项目的jar文件并指定类名称吗,例如Class.forName(“ oracle.jdbc.driver.OracleDriver”)
gmhk 2010年


2

不知道您要问什么,但是... Class.forname,也许吗?


其引发的ClassNotFound异常
史蒂文

如果班级在不同的项目中怎么办?
史蒂文

1
我发现没有人在回答您的问题。只要编译器知道在哪里查看,它是否在另一个项目中都没有关系。由于您可能正在使用IDE,因此它可能仅取决于IDE。关于引用的事情,您知道从Java库引用的所有类都不在您的项目中,对吗?但是,编译器知道在哪里寻找它们,因为它知道它们是在外部引用的。尝试进行高级Java编程时,您似乎需要学习基本的Java编程。:|
user919860 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.