¶Ô±ÈÐÂÎļþ |
| | |
| | | /* |
| | | * 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 墿¥æ¢¦ (596392912@qq.com) |
| | | */ |
| | | package org.springblade.core.tool.utils; |
| | | |
| | | 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); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 夿æ¯å¦ææ³¨è§£ Annotation |
| | | * |
| | | * @param method Method |
| | | * @param annotationType 注解类 |
| | | * @param <A> æ³åæ è®° |
| | | * @return {boolean} |
| | | */ |
| | | public static <A extends Annotation> boolean isAnnotated(Method method, Class<A> annotationType) { |
| | | // å
æ¾æ¹æ³ï¼åæ¾æ¹æ³ä¸çç±» |
| | | boolean isMethodAnnotated = AnnotatedElementUtils.isAnnotated(method, annotationType); |
| | | if (isMethodAnnotated) { |
| | | return true; |
| | | } |
| | | // è·åç±»ä¸é¢çAnnotationï¼å¯è½å
å«ç»åæ³¨è§£ï¼æ
éç¨springçå·¥å
·ç±» |
| | | Class<?> targetClass = method.getDeclaringClass(); |
| | | return AnnotatedElementUtils.isAnnotated(targetClass, annotationType); |
| | | } |
| | | |
| | | } |