能否为Java注解添加转换器?相关实现问题咨询
问题解决方案
一、调用注解中转换器的默认convert方法
你当前代码无法直接调用convert方法的核心原因是:converter()返回的是Class<MyConverter>类型,而接口的默认方法属于实例成员,不能直接通过类调用。提供两种可行解决方式:
1. 实例化转换器类(推荐)
如果转换器类(包括默认的MyConverter)支持无参构造,先创建实例再调用方法:
class Foo { public Object convert(AccessibleObject a) throws InstantiationException, IllegalAccessException { MyAnnotation annotation = a.getAnnotation(MyAnnotation.class); // 实例化注解指定的转换器类 MyConverter converter = annotation.converter().newInstance(); // 调用默认的convert方法 return converter.convert(a); } }
若转换器类需要带参构造,可通过反射获取对应构造方法完成实例化。
2. 通过反射直接调用接口默认方法
如果不想实例化对象,可通过反射机制直接调用接口的默认方法:
import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; class Foo { public Object convert(AccessibleObject a) throws Throwable { MyAnnotation annotation = a.getAnnotation(MyAnnotation.class); Class<? extends MyConverter> converterClass = annotation.converter(); // 获取接口的默认convert方法 MethodHandles.Lookup lookup = MethodHandles.lookup(); MethodType methodType = MethodType.methodType(Object.class, Object.class); // 调用默认方法,接口默认方法的实例参数可传null return lookup.findVirtual(converterClass, "convert", methodType) .invokeExact(null, a); } }
二、支持Function<String, Object>类型的转换器
要在注解中兼容Function<String, Object>类型,可通过以下两种方式实现:
1. 让MyConverter继承Function接口
修改转换器接口,使其兼容Function规范,既保留原有默认方法,又能直接作为Function使用:
import java.util.function.Function; public interface MyConverter extends Function<Object, Object> { @Override default Object apply(Object o) { return convert(o); } default Object convert(Object o) { return o.toString(); } } @interface MyAnnotation { Class<? extends MyConverter> converter() default MyConverter.class; }
使用时可直接将转换器实例转为Function:
MyConverter converter = annotation.converter().newInstance(); Function<Object, Object> functionConverter = converter;
2. 在注解中新增Function类型属性
若不想修改原有转换器接口,可在注解中单独添加Function类型的配置属性(注解仅支持常量,因此用Class<? extends Function>指定实现类):
import java.util.function.Function; public interface MyConverter { default Object convert(Object o) { return o.toString(); } } @interface MyAnnotation { Class<? extends MyConverter> converter() default MyConverter.class; // 新增Function类型转换器的配置属性 Class<? extends Function<String, Object>> functionConverter() default DefaultStringFunction.class; } // 默认的Function实现类 class DefaultStringFunction implements Function<String, Object> { @Override public Object apply(String s) { return s; } }
使用时实例化该Function类即可:
Function<String, Object> function = annotation.functionConverter().newInstance(); Object result = function.apply(a.toString());
内容的提问来源于stack exchange,提问作者Dasma
相关产品推荐
相关产品推荐

