0

コンストラクターが 1 つのパラメーターを受け取る場合、その場で使用したい実行時にクラスをコンパイルしました。

package com.notmycompany;

import com.mycompany.Manager;
import com.mycompany.Processor;

import com.mycompany.Event;

public class CustomProcessor extends Processor {


    public CustomProcessor( Manager m) {
        super( m);
    }

    @Override
    public void process( Event evt) {
        // Do you own stuff
        System.out.println( "My Own Stuff");
    }
}

コンパイルはうまくいき、すぐにクラスをロードできます。しかし、コンストラクターは私に苦労しています。

Class<?> clazz = urlClassLoader.loadClass("com.notmycompany.CustomProcessor");
Constructor<?> constructor = clazz.getConstructor( com.mycompany.Manager.class);
this.customProcessor = (Processor) constructor.newInstance( this.manager);

この場合、代わりに 使用してみgetConstructorたスローがスローされますが、通話中にさらに一歩進むだけです(もちろん、this.manager は com.mycompany.Manager です)。NoSuchMethodException

getConstructorsIllegalArgumentExceptionnewInstance

Constructor<?> list[] = clazz.getConstructors();
Constructor<?> constructor = list[0];
this.customProcessor = (Processor) constructor.newInstance( this.manager);

何をしても、実行時の Manager オブジェクトとコンパイル時に不一致があり
ます このコンストラクターの署名を修正するにはどうすればよいですか?

編集 1: getParameterTypes 出力

        for( Class<?> c : constructor.getParameterTypes()) {
            System.out.println( c);
        }

出力

class com.mycompany.Manager


編集 2:一時的な回避策としてコンストラクター パラメーターを削除しました。コンストラクターが呼び出されると

、コードは次のようにClassCastException不平を言います。com.notmycompany.CustomProcessor cannot be cast to com.mycompany.Processor

Constructor<?> constructor = clazz.getConstructor();
this.customProcessor = (Processor) constructor.newInstance();

これはすべて、ランタイム クラスがコンパイルのものと矛盾しているように見えるという同じ問題の一部であるように思われますが、名前は一致します。

4

2 に答える 2

1

コンストラクターであると思われるメソッドの名前が異なるため、 CustomProcessor クラスにはコンストラクターがありません。

public CustomLatencyProcessor(Manager m) {
    super(m);
}

に変更する必要があります

public CustomProcessor(Manager m) {
    super(m);
}

クラスの名前が CustomProcessor であるためです。コンストラクターの名前は、それを含むクラスの名前と正確に一致する必要があります。

于 2013-07-07T23:08:44.790 に答える
1

currentThread を親として使用する URL を使用した後、最終的に動作させることができました (URL でゼロから作成された URLClassLoader とは対照的に)。

URLClassLoader ucl = (URLClassLoader)Thread.currentThread().getContextClassLoader();
URLClassLoader ucl2 = new URLClassLoader( new URL[] { new URL( "file://d:/temp/")},ucl);
Class<?> clazz = ucl2.loadClass("com.notmycompany.CustomProcessor");

これで 2 日間節約できることを願っています。

于 2013-07-08T10:31:58.197 に答える