有任何实用的方法可以以类型安全的方式在类上引用方法吗?一个基本的示例是,如果我想创建类似以下实用程序功能的东西:
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] 删除。
我来说两句