/* * Copyright (c) 2018-2028, DreamLu All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the dreamlu.net developer nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * Author: DreamLu 卢春梦 ([email protected]) */ package com.xkcoding.magic.core.tool.util; import org.springframework.core.BridgeMethodResolver; import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.MethodParameter; import org.springframework.core.ParameterNameDiscoverer; import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.core.annotation.SynthesizingMethodParameter; import org.springframework.web.method.HandlerMethod; import java.lang.annotation.Annotation; import java.lang.reflect.Constructor; import java.lang.reflect.Method; /** * 类工具类 * * @author L.cm */ public class ClassUtil extends org.springframework.util.ClassUtils { private static final ParameterNameDiscoverer PARAMETER_NAME_DISCOVERER = new DefaultParameterNameDiscoverer(); /** * 获取方法参数信息 * * @param constructor 构造器 * @param parameterIndex 参数序号 * @return {MethodParameter} */ public static MethodParameter getMethodParameter(Constructor<?> constructor, int parameterIndex) { MethodParameter methodParameter = new SynthesizingMethodParameter(constructor, parameterIndex); methodParameter.initParameterNameDiscovery(PARAMETER_NAME_DISCOVERER); return methodParameter; } /** * 获取方法参数信息 * * @param method 方法 * @param parameterIndex 参数序号 * @return {MethodParameter} */ public static MethodParameter getMethodParameter(Method method, int parameterIndex) { MethodParameter methodParameter = new SynthesizingMethodParameter(method, parameterIndex); methodParameter.initParameterNameDiscovery(PARAMETER_NAME_DISCOVERER); return methodParameter; } /** * 获取Annotation * * @param method Method * @param annotationType 注解类 * @param <A> 泛型标记 * @return {Annotation} */ public static <A extends Annotation> A getAnnotation(Method method, Class<A> annotationType) { Class<?> targetClass = method.getDeclaringClass(); // The method may be on an interface, but we need attributes from the target class. // If the target class is null, the method will be unchanged. Method specificMethod = ClassUtil.getMostSpecificMethod(method, targetClass); // If we are dealing with method with generic parameters, find the original method. specificMethod = BridgeMethodResolver.findBridgedMethod(specificMethod); // 先找方法,再找方法上的类 A annotation = AnnotatedElementUtils.findMergedAnnotation(specificMethod, annotationType); ; if (null != annotation) { return annotation; } // 获取类上面的Annotation,可能包含组合注解,故采用spring的工具类 return AnnotatedElementUtils.findMergedAnnotation(specificMethod.getDeclaringClass(), annotationType); } /** * 获取Annotation * * @param handlerMethod HandlerMethod * @param annotationType 注解类 * @param <A> 泛型标记 * @return {Annotation} */ public static <A extends Annotation> A getAnnotation(HandlerMethod handlerMethod, Class<A> annotationType) { // 先找方法,再找方法上的类 A annotation = handlerMethod.getMethodAnnotation(annotationType); if (null != annotation) { return annotation; } // 获取类上面的Annotation,可能包含组合注解,故采用spring的工具类 Class<?> beanType = handlerMethod.getBeanType(); return AnnotatedElementUtils.findMergedAnnotation(beanType, annotationType); } }