簡體   English   中英

通過Reflection API在ClassLoader之間傳遞參數

[英]Passing Parameters Between ClassLoaders Via Reflection API

我正在使用自定義類加載器來創建和返回類的實例,這似乎工作正常但是當我嘗試調用方法(通過Reflection API)並傳入自定義對象時,如下所述,我得到一個NoSuchMethodException

假設自定義類加載器創建並返回如下所示的實例:

Object obj = customClassLoader.load(String className,Class[] paramTypes,Object[] param)

然后我調用一個方法(通過反射)並傳入一個自定義對象:

注意:這就是造成錯誤的因素

Method m = obj.getClass.getDeclaredMethod("mName",new Class[]{aCustomObject.class}) 

m.invoke(obj,new Object[]{new CustomObject() })

我很難理解可能導致異常的原因,因為確實存在一個接受指定自定義對象的方法,我通過使用反射來列出所有方法來證實這一點。

你的自定義加載器的load()方法如何實例化它要返回的對象? 在嘗試查找正確的構造函數時,可能會出現NoSuchMethodException

這個例子似乎沒問題:

package com.pholser;

import java.lang.reflect.Method;

public class ClassLoading {
    public static class CustomLoader extends ClassLoader {
        public Object load(String className, Class<?>[] paramTypes, Object[] params) throws Exception {
            Class<?> loaded = loadClass(className);
            return loaded.getConstructor(paramTypes).newInstance(params);
        }
    }

    public static class ACustomObject {
    }

    public void foo(ACustomObject a) {
        System.out.println("foo");
    }

    public static Object newCustomObject() throws Exception {
        return new CustomLoader().load("com.pholser.ClassLoading$ACustomObject", new Class<?>[0], new Object[0]);
    }

    public static void main(String[] args) throws Exception {
        ClassLoading obj = new ClassLoading();

        Method m = obj.getClass().getDeclaredMethod("foo", ACustomObject.class);

        m.invoke(obj, newCustomObject());
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM