Java:运行时方法解析
|
我正在通过解释器进行代码的动态调用,并且正在进入方法解析的棘手的丑陋区域,如JLS 15.12节所述。
选择方法的“简便”方法是当您知道所有参数的确切类型时,此时可以使用
Class.getDeclaredMethod(String name, Class[] parameterTypes)
。也许您必须检查方法的可访问性和类的超类/超接口。
但这不涉及以下任何情况,因此它是无用的:
装箱/拆箱原语
亚型
可变参数
空参数(可以是任何类型,除非解释器知道其他情况;在编译时,通过将null转换为类/接口可以消除任何歧义)
原始类型转换(不是Java的一部分,但在语言环境中是允许的-例如Rhino Javascript,其中所有数字均为浮点数,因此Java代码可能会采用int
,但调用方会传入一个int
或一个double
)
(请参见下面的前三个示例)
所以现在我必须编写自己的方法解析库...
是否有任何知名的框架库可以帮助您解决此问题?
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);
}
}
没有找到相关结果
已邀请:
4 个回复
佃蒜狗掂哥
厦惫
逝媳蘑贩茄
锹缄