Java中类型安全的方法反射

jthg:

有任何实用的方法可以以类型安全的方式在类上引用方法吗?一个基本的示例是,如果我想创建类似以下实用程序功能的东西:

public Result validateField(Object data, String fieldName, 
                            ValidationOptions options) { ... }

为了调用它,我将必须做:

validateField(data, "phoneNumber", options);

这迫使我要么使用魔术字符串,要么在该字符串的某个地方声明一个常量。

我敢肯定,使用现有的Java语言无法解决这个问题,但是是否有某种(生产级)预编译器或替代编译器可以解决这一问题?(类似于AspectJ扩展Java语言的方式)最好改为执行以下操作:

public Result validateField(Object data, Method method, 
                            ValidationOptions options) { ... }

并调用:

validateField(data, Person.phoneNumber.getter, options);
速度

正如其他人提到的那样,没有真正的方法可以做到这一点……而且我还没有看到支持它的预编译器。至少可以说,语法会很有趣。即使在您的示例中,它也只能覆盖用户可能想要做的一小部分潜在的反射可能性,因为它不会处理非标准的访问器或带有参数的方法等。

即使无法在编译时进行检查,如果您希望不良代码尽快失败,那么一种方法是在类初始化时解析引用的Method对象。

假设您有一个实用程序方法来查找可能抛出错误或运行时异常的Method对象:

public static Method lookupMethod( Class c, String name, Class... args ) {
    // do the lookup or throw an unchecked exception of some kind with a really
    // good error message
}

然后在您的类中,使用常量来预解析将要使用的方法:

public class MyClass {
    private static final Method GET_PHONE_NUM = MyUtils.lookupMethod( PhoneNumber.class, "getPhoneNumber" );

    ....

    public void someMethod() {
        validateField(data, GET_PHONE_NUM, options);
    }
}

至少这样,它将在第一次加载MyClass时失败。

我经常使用反射,尤其是bean属性反射,并且我已经习惯于在运行时后期处理异常。但是,由于种种其他原因,这种风格的Bean代码往往会出错,而且非常动态。对于介于两者之间的内容,上述方法将有所帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章