2

标题我尽力了,但它可能不是一个好的措辞,所以我会尽力解释这个问题。对于熟悉 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陈述,我只是想如果我能做到这一点,我可以让我的生活更轻松。如果您需要更多信息,我会尽我所能提供给您。

4

3 回答 3

3

你可以这样做:

Class<?> myclass = Class.forName(spell);
于 2013-09-19T20:53:45.077 回答
1

使用规则.class这里

类字面量是由类、接口、数组或原始类型或伪类型 void 的名称组成的表达式,后跟一个“.”。和令牌类。

所以你不能像这样使用它

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

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

Class cls = cl.loadClass(spell);

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

forName()除非它是完全限定名称,否则您将无法找到一个类。


不要忘记获取ClassLoader参考。

于 2013-09-19T20:54:54.447 回答
0

你的代码有严重的问题。

首先你需要实例化 ClassLoader:

ClassLoader cl = ClassLoader.getSystemClassLoader();

其次,作为 String 参数提供给方法 in 的任何类名ClassLoader必须是 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);
于 2013-09-19T21:02:35.727 回答