如何实现@NullToDefault注解自动将空方法参数替换为默认值?
实现@NullToDefault注解自动替换方法参数空值
现有代码的问题
你写的inject方法是用来处理类字段的,但需求是处理方法参数,所以这个方法无法满足你的需求,必须调整实现思路。Java本身没有原生支持方法参数注解的自动触发逻辑,得通过反射或AOP这类机制来实现参数替换。
方案1:原生Java反射封装调用(无框架依赖)
1. 完善注解定义(支持自定义默认值)
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PARAMETER) public @interface NullToDefault { // 允许指定自定义默认值,默认值为"default" String value() default "default"; }
2. 编写参数处理工具类
通过反射拦截方法调用,检查参数并替换空值:
import java.lang.reflect.Method; import java.lang.reflect.Parameter; public class NullToDefaultProcessor { /** * 处理带@NullToDefault注解的方法参数,自动替换null为默认值 * @param target 方法所属对象(静态方法传null) * @param method 要执行的方法 * @param args 方法参数数组 * @return 方法执行结果 * @throws Exception 反射调用异常 */ public static Object invoke(Object target, Method method, Object[] args) throws Exception { Parameter[] parameters = method.getParameters(); for (int i = 0; i < parameters.length; i++) { // 检查参数是否有注解且值为null if (parameters[i].isAnnotationPresent(NullToDefault.class) && args[i] == null) { NullToDefault annotation = parameters[i].getAnnotation(NullToDefault.class); args[i] = annotation.value(); } } // 执行原方法 return method.invoke(target, args); } }
3. 使用示例
public class TestDemo { static void myMethod(@NullToDefault String param) { System.out.println(param); } static void myCustomMethod(@NullToDefault("my_custom_default") String param) { System.out.println(param); } public static void main(String[] args) throws Exception { // 调用myMethod Method method1 = TestDemo.class.getDeclaredMethod("myMethod", String.class); NullToDefaultProcessor.invoke(null, method1, new Object[]{"foo"}); // 输出: foo NullToDefaultProcessor.invoke(null, method1, new Object[]{null}); // 输出: default // 调用自定义默认值的方法 Method method2 = TestDemo.class.getDeclaredMethod("myCustomMethod", String.class); NullToDefaultProcessor.invoke(null, method2, new Object[]{null}); // 输出: my_custom_default } }
方案2:Spring AOP自动拦截(Spring环境适用)
如果你的项目是Spring环境,可以用AOP实现无侵入式的自动参数处理:
1. 编写切面类
import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.reflect.MethodSignature; import java.lang.reflect.Parameter; @Aspect public class NullToDefaultAspect { // 定义切点:拦截所有带@NullToDefault注解参数的方法(可根据需求调整切点表达式) @Before("execution(* *(..))") public void processNullParams(JoinPoint joinPoint) { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Parameter[] parameters = signature.getMethod().getParameters(); Object[] args = joinPoint.getArgs(); for (int i = 0; i < parameters.length; i++) { if (parameters[i].isAnnotationPresent(NullToDefault.class) && args[i] == null) { NullToDefault annotation = parameters[i].getAnnotation(NullToDefault.class); args[i] = annotation.value(); } } } }
2. 启用Spring AOP
在Spring配置类上添加@EnableAspectJAutoProxy注解,之后直接调用方法即可自动触发参数替换:
@Service public class TestService { public void myMethod(@NullToDefault String param) { System.out.println(param); } } // 在其他类中调用 @Autowired private TestService testService; public void test() { testService.myMethod("foo"); // 输出: foo testService.myMethod(null); // 输出: default }
内容的提问来源于stack exchange,提问作者gad_gadskiy
相关产品推荐
相关产品推荐

