我在标题上做得最好,但这可能不是一个很好的方式,所以我会尽力解释这个问题。对于那些熟悉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
陈述,我只是认为如果我可以做这项工作,我可以让我的生活更轻松。如果您需要更多信息,我会尽我所能。
答案 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);