1

次のステートメントを使用してクラスをロードしています。

Class classToLoad = Class.forName("com.somePackage.SomeotherPackage.classname" );

後で、リフレクションを使用してこのクラスのメソッドを取得します。methodname.invoke() 関数を使用してメソッドを呼び出すには、ロードされたクラスのオブジェクトが必要です。したがって、ロードされたクラスのオブジェクトを作成したいと思います。私はこのようにしようとしています:

Object obj = classToLoad.newInstance();

しかし、これの問題は、この方法ではロードされたクラスのオブジェクトを取得できず、Object クラスのオブジェクトを取得することです。

ロードされたクラスの関数を呼び出したい場合は、次のようにします。

methodName.invoke(obj);

それは例外をスローします:

java.lang.IllegalArgumentException: オブジェクトは宣言クラスのインスタンスではありません

誰でも助けてもらえますか?

問題の更新:

問題は、割り当ての左側を別のクラス タイプにする必要があり、そのクラス タイプは実行時に決定されることです。

以下のステートメントの場合:

オブジェクト インスタンス = clazz.newInstance();

「インスタンス」は「オブジェクト」クラスではなく、「クラズ」タイプである必要があります。

どうすればこれを達成できますか?

4

4 に答える 4

0

問題は、割り当ての左側を別のクラス タイプにする必要があり、そのクラス タイプは実行時に決定されることです。...どうすればこれを達成できますか?

Java以外の言語を使用してください。Java は静的に型付けされています。つまり、基本的には、今求められたことを正確に実行することは許可されていません。ここでの他の回答は、コンパイル時にオブジェクトの型を知らずにメソッドを呼び出す方法を正しく示していますが、実行時に変数の型を設定することはできません。

于 2013-02-28T04:11:27.437 に答える
0

すべてが正しく設定されている場合、正常に動作します。

import java.lang.reflect.Method;

class Foo {

    public Foo() {
    }

    public void sayHello() {
        System.out.println("Hello");
    }
}

public class Test {    

    public static void main (String[] args) throws Exception {
        Class<?> clazz = Class.forName("Foo");
        Method method = clazz.getMethod("sayHello");
        Object instance = clazz.newInstance();

        method.invoke(instance); // Prints Hello
    }
}

私の推測では、あなたがフェッチしたメソッド ( methodName) は、実際には からフェッチされたものではありませんclassToLoad

于 2013-02-27T18:48:01.923 に答える
0

戻り値の型をキャストして、メソッドを直接呼び出すこともできます。

public class Foo{
    void HelloReflection(){
        System.out.println("Hello reflection");
    }
    public static void main(String[] args){
        try{
            Foo o = (Foo) Class.forName("Foo").newInstance();
            o.HelloReflection();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
于 2013-02-27T18:49:30.683 に答える
0
java.lang.IllegalArgumentException: object is not an instance of declaring class

これは、メソッドに引数がなく、オブジェクトのクラスに見つからない場合にスローされる可能性があります。おそらく、間違ったオブジェクトで呼び出しメソッドを呼び出しているか、フェッチされたメソッドがオブジェクトに対して間違っています。

于 2013-02-27T18:53:40.930 に答える