-1

クラスファイルから動的にロードしようとしています。以下のコードは、クラスのメソッドの呼び出しに失敗します。

    public static void main(String[] args) {
        try {
            File loadPath = new File("C:/loadtest/");
            URL url = loadPath.toURI().toURL();
            URL[] urls = new URL[]{url};
            ClassLoader cl = new URLClassLoader(urls);
            Class cls = cl.loadClass("TesterClass");
            System.out.println("Classname: " + cls.getName());
            Method[] m = cls.getMethods();
            for (Method m1 : m){
                try {
                    System.out.println("Method: " + m1.getName());
                    if (m1.getName().equals("getName")) {
                        Object o = m1.invoke(null, null);
                        System.out.println("o is : " + o);
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        } catch (MalformedURLException | ClassNotFoundException e) {
        }
    }

呼び出そうとしているターゲット Java クラス:

public class TesterClass {

    public hamster() {
    }

    public void getName() {
        System.out.println("TEST SUCCEED !!!");
    }

}

私が得たものは:

Classname: TesterClass
Method: getName
Method: getClass
Method: hashCode
Method: equals
Aug 07, 2013 4:06:44 PM Tester main
Method: toString
Method: notify
Method: notifyAll
Method: wait
SEVERE: null
Method: wait
Method: wait
java.lang.NullPointerException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at Tester.main(Tester.java:40)

上記のコードをコンパクトにするためにコメントと不要な部分を削除したため、行番号 40 は不正確です。

NullPointerException が発生するのはなぜですか? 「getName()」メソッドのみを呼び出すように変更しようとしましたが、これもクラッシュしました。これを解決するにはどうすればよいですか?

4

1 に答える 1

7

nullに渡しているため、NPE を取得していますinvoke:

Object o = m1.invoke(null, null);

...インスタンスメソッド用。インスタンス メソッドを呼び出すには、クラスのインスタンスを渡す必要があります。

おそらくクラスを取得した直後に、インスタンスを作成します。

Class cls = cl.loadClass("TesterClass");
Object inst = cls.newInstance(); // <== This is the new line

...そして、メソッドを呼び出すときに、そのインスタンスを渡します。nullまた、varargs をサポートする Java のバージョン (つまり、漠然と最近のもの) では2 番目は必要ないと思います。

Object o = m1.invoke(inst);
// Instance here ----^

または古いバージョンの場合:

Object o = m1.invoke(inst, null);
// Instance here ----^
于 2013-08-07T08:25:53.747 に答える