我正在通过一个解释器进行一些动态的代码调用,而我正在研究
JLS section 15.12中讨论的方法分辨率的粘性丑陋的方面.
但这并不涵盖以下任何一种情况,所以没有用处:
拳击/拆箱原语
>亚型
varargs
>一个空参数(可以是任何类型,除非解释器另有说明);在编译时,任何歧义将通过将null转换为类/接口来消除)
>原始类型转换(不是Java的一部分,但在语言的上下文中允许 – 例如Rhino Javascript,其中所有数字都是浮点型的,因此Java代码可能需要一个int,但是调用者会传入一个int,或双)
(参见下面的前三个例子)
所以现在我必须编写自己的方法解析库…
有没有一个知名的框架库来协助呢?
package com.example.test.reflect;
import java.lang.reflect.Method;
public class MethodResolutionTest {
public void compute(int i) { /* implementation... */ }
public void compute(Long l) { /* implementation... */ }
public void compute(Object obj) { /* implementation... */ }
public void compute(String... strings) { /* implementation... */ }
public static void main(String[] args) {
Class> cl = MethodResolutionTest.class;
/* these succeed */
findAndPrintMethod(cl, "compute", int.class);
findAndPrintMethod(cl, "compute", Long.class);
findAndPrintMethod(cl, "compute", Object.class);
findAndPrintMethod(cl, "compute", String[].class);
/* these fail */
findAndPrintMethod(cl, "compute", Integer.class);
findAndPrintMethod(cl, "compute", long.class);
findAndPrintMethod(cl, "compute", MethodResolutionTest.class);
findAndPrintMethod(cl, "compute", String.class, String.class);
}
private static void findAndPrintMethod(Class> objectClass,
String methodName, Class>... parameterTypes)
{
try {
Method method = findMethod(objectClass, methodName,
parameterTypes);
System.out.println(method.toString());
}
catch (SecurityException e) {
e.printStackTrace();
}
catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
private static Method findMethod(Class> objectClass,
String methodName, Class>[] parameterTypes)
throws SecurityException, NoSuchMethodException
{
return objectClass.getDeclaredMethod(methodName, parameterTypes);
}
}