gpt4 book ai didi

Java:获取带有接口(interface)参数的方法及其实现

转载 作者:行者123 更新时间:2023-11-30 07:13:34 28 4
gpt4 key购买 nike

我想调用具有参数接口(interface)的方法(使用反射)——即:List 但带有 L​​ist 的实现。例如:

public class Test {

public static void main(String[] args) throws NoSuchMethodException {
Method method = Test1.class.getMethod("method", new Class[]{ArrayList.class});

}

public class Test1 {

public void method(List list) {
System.out.println("method");
}
}
}

我得到 NoSuchMethodException。在这种情况下,我知道我得到了哪些参数,问题是当我不“静态”知道参数类型时,我想一般地使用它。

getMethod 是否也返回以接口(interface)为参数的方法?或者我必须编写自己的“方法搜索器”

谢谢。

编辑:这要复杂得多。我正在尝试在我的程序中编写类似“动态模块化体系结构”的内容。我有核心,它应该与其他模块通信。所以我在编程时不知道参数类,但在运行时。

 public Object processMessage(String target, String methodName, List<Object> params, Object returnNonExist) {
Module m = modules.get(target);
if (m == null) {
return returnNonExist;
} else {
Class[] paramsTypes = new Class[params.size()];
for (int i = 0; i < params.size(); i++) {
paramsTypes[i] = params.get(i).getClass();
}
}
try {
Method method = m.getClass().getMethod(methodName, paramsTypes);
Object result = method.invoke(m, params.toArray());
return result;
}

更好吗?

最佳答案

我可能找到了解决方案——我必须编写自己的“方法搜索器”,它尊重接口(interface)实现和父类(super class)。它看起来像这样:

public static Method findMethod(Object m, String methodName, Class[] paramsTypes) {
Method[] metody = m.getClass().getDeclaredMethods();
List<Method> sameNames = new ArrayList<Method>();
// filter other names
for (Method meth : metody) {
if (meth.getName().equals(methodName)) {
sameNames.add(meth);
}
}
// lets find best candidate
if (sameNames.isEmpty()) {
return null;
} else {
// filter other count of parameters
List<Method> sameCountOfParameters = new ArrayList<Method>();
for (Method meth : sameNames) {
if (meth.getParameterTypes().length == paramsTypes.length) {
sameCountOfParameters.add(meth);
}
}
if (sameCountOfParameters.isEmpty()) {
return null;
} else {
for (Method meth : sameCountOfParameters) {
// first one, which is suitable is the best
Class<?>[] params = meth.getParameterTypes();
boolean good = true;
for (int i = 0; i < params.length && good; i++) {
if (params[i].isInterface() && Arrays.asList(paramsTypes[i].getInterfaces()).contains(params[i])) {
//if i-th paramater type is Interface and we search method with its implementation
good = true;
continue;
} else {
// if we call it with subclass and parameter typ is superclass
if (paramsTypes[i].getSuperclass().equals(params[i])) {
good = true;
continue;
}
}
good = false;
}
if (good) {
return meth;
}
}
}
}
return null;
}

我在标准 getMethod 抛出“NoSuchMethodException”后使用它(在大约 5% 的情况下,所以我不关心速度。

关于Java:获取带有接口(interface)参数的方法及其实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19313259/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com