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);


    }

}

ここでの私の目標は (可能かどうか、または適切なコードを使用しているかどうかがわからないため、明確でない場合)、ユーザーの入力を variable に取得することです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();

第 2 に、メソッドに String パラメーターとして提供されるすべてのクラス名は、ClassLoaderJava™ 言語仕様で定義されているバイナリー名でなければなりません。

有効なクラス名の例は次のとおりです。

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

loadClass3 番目に、次のようにメソッドを呼び出す必要があります。

Class clazz = cl.loadClass(name);
于 2013-09-19T21:02:35.727 に答える