试图从字符串访问类

时间:2013-09-19 20:51:16

标签: java

我在标题上做得最好,但这可能不是一个很好的方式,所以我会尽力解释这个问题。对于那些熟悉Windows BATCH的人,这段代码

set /p var =
goto %var%

将转到名称为存储在变量var中的字符串的页面。我需要在Java中做同样的事情。是的,我完全清楚使用if语句对于这个想法是令人满意的,除了它需要更多的代码行。我的方法是:

import java.util.Scanner;
public class blarg {

    public static void main(String[] args) throws NullPointerException{

        Scanner scan = new Scanner(System.in);
        String spell = scan.nextLine();

        ClassLoader cl = null;

        Class cls = (cl.loadClass(spell)).class;
        String name = cls.getName();

        cl.loadClass(name);


    }

}

我的目标(如果它不清楚,因为我不知道它是否可能或我是否使用正确的代码)是取用户的输入变量spell。然后,我使用Class cls = (cl.loadClass(spell)).class获取与spell相关联的类,然后获取该类,使用String name = cls.getName();获取完全限定名称,最后加载该类。

我在Eclipse中遇到以下错误:

线程中的异常" main" java.lang.Error:未解决的编译问题:令牌上的语法错误" class",标识符预期

那么,是否有某种方法可以解决语法错误(通过添加标识符),或者是否有其他人知道如何做我想做的事情?如果没有,我绝不反对使用if陈述,我只是认为如果我可以做这项工作,我可以让我的生活更轻松。如果您需要更多信息,我会尽我所能。

3 个答案:

答案 0 :(得分:3)

你可以这样做:

Class<?> myclass = Class.forName(spell);

答案 1 :(得分:1)

使用.class的规则是here

  

类文字是一个由类名称组成的表达式,   接口,数组或基本类型,或伪类型void   一个'。'和令牌类。

所以你不能这样使用它

Class cls = (cl.loadClass(spell)).class;

loadClass()方法已经加载了您的类,只需使用

Class cls = cl.loadClass(spell);

假设spell包含完全限定的类名。

除非它是完全限定的名称,否则您将无法找到forName()的课程。


不要忘记获得ClassLoader参考。

答案 2 :(得分:0)

您的代码存在严重问题。

首先需要实例化ClassLoader:

ClassLoader cl = ClassLoader.getSystemClassLoader();

其次,作为ClassLoader中方法的String参数提供的任何类名必须是Java™语言规范定义的二进制名称。

有效类名的示例包括:

   "java.lang.String"
   "javax.swing.JSpinner$DefaultEditor"
   "java.security.KeyStore$Builder$FileBuilder$1"
   "java.net.URLClassLoader$3$1"

第三,你应该按如下方式调用loadClass方法:

Class clazz = cl.loadClass(name);