通过Reflection API在ClassLoader之间传递参数

时间:2012-11-08 15:09:39

标签: java reflection classloader

我正在使用自定义类加载器来创建和返回类的实例,这似乎工作正常但是当我尝试调用一个方法(通过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() })

由于确实存在一个接受指定自定义对象的方法,我很难理解导致异常的原因,我已经通过使用反射来列出所有方法来确认这一点。

1 个答案:

答案 0 :(得分:2)

你的自定义加载器的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());
    }
}