从Java类加载的类访问扩展功能

时间:2013-09-04 08:20:19

标签: java classloader extend

我有一个类(A类)扩展另一个类(B类)。我动态地加载A类,我希望通过A类访问扩展功能。

示例:

Class A extends Class B
- function getName()

Class B
- function abstract getName()
- function doSomethingElse()

我如何用Java(访问doSomethingElse())?


我正在阅读代码,我怀疑这可能是代码行:

public Object invoke(String classname, String method, Object args) {
        Object res = null;
        try {
            for (Class i : classes) {
                if (i.getName().equals(classname)) {
                    Object obj = i.newInstance();
                    Method loadMethod = i.getMethod(method, null);
                    res = loadMethod.invoke(obj, args);
                }
            }
        } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | IllegalArgumentException | InvocationTargetException ex) {
            ex.printStackTrace();
        }
        return res;
    }

我正在尝试为method.invoke()方法编写一个适配器,以便更容易调用方法,但错误都指向此代码片段产生所有问题。我将getMethod的第二个参数设置为null,我认为这是问题,但我不知道如何解决它。

1 个答案:

答案 0 :(得分:0)

我猜你在问如何使用反射。请注意getName()上已存在java.lang.Class

如果一个类包含抽象方法,那么该类本身必须声明为abstract:

package com.sandbox;

abstract public class B {
    public abstract String getName();
    public String doSomethingElse() {
        return "done";
    }
}

接下来,定义扩展类。

package com.sandbox;

public class A extends B {
    public String getName() {
        return "A";
    }
}

最后,对于反射用法的草率示例:

package com.sandbox;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Program {

    /**
     * @param args
     * @throws InstantiationException 
     * @throws InvocationTargetException 
     * @throws IllegalArgumentException 
     * @throws IllegalAccessException 
     * @throws ClassNotFoundException 
     */
    public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException, ClassNotFoundException {

        // use a class loader to dynamically load a class
        ClassLoader classLoader = Program.class.getClassLoader();
        Class<?> aClass = classLoader.loadClass("com.sandbox.A");

        // all methods defined on the class and its superclasses and superinterfaces are available through getMethods() call
        Method[] allMethods = aClass.getMethods();
        for (Method m : allMethods) {
            if (m.getName() == "doSomethingElse") {
                String result = (String) m.invoke(aClass.newInstance(), null);
                System.out.println("Function call is " + result);
            }
        }
    }
}

那应该输出

  

完成函数调用