0

我有一个类(A 类)扩展了另一个类(B 类)。我动态加载 Class A,我希望通过 Class 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,我认为这是问题所在,但我不知道如何解决它。

4

1 回答 1

0

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

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

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);
            }
        }
    }
}

那应该输出

函数调用完成

于 2013-09-04T08:48:22.813 回答