0

私は一種のパッケージスキャンに取り組んでいます。これはおそらく最善の方法ではありませんが、私が Google で見つけたソリューションは、私が必要としている以上のことをしているように思えました。

クラスをインスタンス化するのに苦労していて、気が狂いそうです。インスタンス化するコードは次のとおりです。

    String[] packageList = {
        getPackageName(),
        "com.socket.event.handler"
    };
    for (String packageListName : packageList) {
        try {
            String className = this.getType(); // getDashboard
            className = className.substring(0, 1).toUpperCase() + className.substring(1)+"Handler"; //GetDashboardHandler
            clazz = Class.forName(packageListName+"."+className) //shows correct package/class name
                    .asSubclass(EventHandler.class);

            return (EventHandler) clazz.getConstructor(clazz.getClass()).newInstance(getData());
            //return (EventHandler) clazz.newInstance();
        } catch (ClassNotFoundException e) {
            //swallow, this is ok
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

そこでgetData()使用されるのは次のようになります。 public HashMap getData() { return data; }

インスタンス化されるクラスは次のとおりです。

public class GetDashboardHandler extends EventHandler<GetDashboardHandler> {
    public String workstationUuid;

    public GetDashboardHandler() {
        super();
    }

    public GetDashboardHandler(HashMap<String, Object> data) {
        super(data, GetDashboardHandler.class);
    }

デフォルトのコンストラクターと、特定のニーズを満たすパラメーターを持つコンストラクターがあります。私はまだこの例外を見ています:

java.lang.NoSuchMethodException: com.socket.event.handler.GetDashboardHandler.<init>(java.lang.Class)
    at java.lang.Class.getConstructor0(Class.java:2730)
    at java.lang.Class.getConstructor(Class.java:1676)
    at com.socket.SocketMessage.getEventHandler(SocketMessage.java:88)
4

1 に答える 1

2

問題はこの行です

clazz.getConstructor(clazz.getClass())

これは、次のように定義されているコンストラクターを探していることを意味します。

public GetDashboardHandler(Class data) {

ただし、パラメータとして HashMap が必要です。

clazz.getConstructor(HashMap.class)
于 2013-04-24T19:56:11.683 に答える