0

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

我对可能导致异常的原因感到困惑,因为确实存在采用指定自定义对象的方法,我已经通过使用反射列出所有方法来确认这一点。

4

1 回答 1

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());
    }
}
于 2012-11-08T22:14:23.107 回答