【问题标题】:Getting Class type from String从字符串获取类类型
【发布时间】:2011-01-25 09:53:52
【问题描述】:

我有一个String,它的类名是"Ex"(没有.class 扩展名)。我想将它分配给Class 变量,如下所示:

Class cls = (string).class

我该怎么做?

【问题讨论】:

  • 如果该类在不同的项目中怎么办?
  • 对你的评论:什么!???如果您的课程在不同的项目中,那么它不取决于您的 IDE 吗?就您的应用程序而言,它就像在同一个项目中一样,因为它的库是在外部引用的。就像,您知道 Java API 类不在您的项目中,对吧?但是,如果您的 IDE 设置正确,您的 IDE 的编译器知道在哪里可以找到它们。这同样适用于您来自另一个项目的类。

标签: java class reflection


【解决方案1】:

应该是:

Class.forName(String classname)

【讨论】:

  • 子类也可以这样做吗?
【解决方案2】:

可以使用ClassforName方法:

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

【讨论】:

  • 我正在使用 Eclipse 中的动态 Web 项目。我正在使用上面的代码来获取一个类。但它返回 ClassNotFoundException,当我使用这样的字符串变量时:String clsName = "com.mydoamin.className"; Class cls = Class.forName(clsName); 如果将完全限定的类名硬编码为参数,那么一切正常。有什么建议吗?
  • @djthequest 如果我们的clsName 变量包含完全限定的类名,那么使用它和硬编码字符串应该没有区别。您可能在类路径中没有您需要的类。在启动代码中从同一个 jar 中实例化一个公共类可能会有所帮助,以确保类加载器中存在该库。
  • 感谢您的回复,但如果我对字符串进行硬编码,则不是变量,而是工作鳍,这意味着类在类路径中,对吗?后来我发现,Class.forName() 方法需要一个 final 变量。一个简单的变量是行不通的。
【解决方案3】:

您可以在运行时通过 Java 反射概念获取任何类的 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来获取一个类对象

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

对此有任何疑问,请告诉我

【讨论】:

  • 如果类在不同的项目中怎么办?
  • 你能得到那个项目的 jar 文件并指定类名,比如 Class.forName("oracle.jdbc.driver.OracleDriver")
【解决方案4】:
Class<?> cls = Class.forName(className);

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

【讨论】:

  • 它抛出 ClassNotFound 异常
  • 那么要么类不在类路径上,要么你没有传递完全限定的类名,例如com.mycompany.project.ClassName
  • className 的值是多少?你的类路径中有这样的类吗?
  • 是的,这个类在同一个包中
  • 我遇到了与ClassNotFoundException 相同的问题。诀窍是在 try-catch 中处理异常。像这样的东西:try { Class&lt;?&gt; 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 */ }
【解决方案5】:
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 上查看关于反射的 Java 教程跟踪以了解更多详细信息。

【讨论】:

  • 博卓的回答可能有更多的意义,但我认为你的回答更具描述性。 PS。你为什么叫娟泽???几乎听起来像是西班牙语和汉语的混合体。 :D。这背后有什么巧妙的含义吗?
  • 我正在使用 Eclipse 中的动态 Web 项目。我正在使用上面的代码来获取一个类。但它返回 ClassNotFoundException,当我使用这样的字符串变量时:String clsName = "com.mydoamin.className"; Class cls = Class.forName(clsName); 如果将完全限定的类名硬编码为参数,那么一切正常。有什么建议吗?
  • @JuanZe 我在搜索其他内容时遇到了这个答案,现在我很好奇......这样的转换可以做什么?
【解决方案6】:

不确定你在问什么,但是...Class.forname,也许吧?

【讨论】:

  • 它抛出 ClassNotFound 异常
  • 如果类在不同的项目中怎么办?
  • 我看到没有人回答你的问题。只要编译器知道在哪里查找,它是否在另一个项目中并不重要。因为,您可能正在使用 IDE,它可能完全取决于 IDE。关于引用,你知道你从 Java 库中引用的所有类都不在你的项目中,对吧?但是,编译器知道在哪里寻找它们,因为它知道它们是在外部引用的。当您尝试高级 Java 编程时,您似乎需要学习基本的 Java 编程。 :|
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2011-01-06
  • 2014-01-01
  • 1970-01-01
  • 2023-02-25
  • 2016-10-24
相关资源
最近更新 更多