我有一个类(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,我认为这是问题,但我不知道如何解决它。
答案 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);
}
}
}
}
那应该输出
完成函数调用