-
2021-03-08 06:30:03
1、获取注解参数
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
//获取注解参数值
ValidateUrl validateObj = methodSignature.getMethod().getAnnotation(ValidateUrl.class);
String serviceName = validateObj.serviceName();
String sourceSystem = generateKeyBySpEL(validateObj.sourceSystem(), joinPoint);
2、解析参数值
/**
* 解析SpEL表达式
* @param spELString
* @param joinPoint
* @return
*/
private String generateKeyBySpEL(String spELString, JoinPoint joinPoint) {
if(StringUtils.isBlank(spELString)){
return null;
}
// 通过joinPoint获取被注解方法
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
Method method = methodSignature.getMethod();
// 使用spring的DefaultParameterNameDiscoverer获取方法形参名数组
String[] paramNames = nameDiscoverer.getParameterNames(method);
// 解析过后的Spring表达式对象
Expression expression = parser.parseExpression(spELString);
// spring的表达式上下文对象
EvaluationContext context = new StandardEvaluationContext();
// 通过joinPoint获取被注解方法的形参
Object[] args = joinPoint.getArgs();
// 给上下文赋值
for(int i = 0 ; i < args.length ; i++) {
context.setVariable(paramNames[i], args[i]);
}
// 表达式从上下文中计算出实际参数值
/*如:@annotation(key="#student.name")
那么就可以解析出方法形参的某属性值“Tom”
*/
return expression.getValue(context).toString();
}
更多相关内容 -
java 通过反射获取类上注解,方法上注解,注解里的值及方法参数
2018-10-09 13:43:49java 通过反射获取类上注解,方法上注解,注解里的值及方法参数,项目为maven项目。导入时记得选择maven项目 -
JAVA 自定义注解及参数获取
2021-03-06 14:56:22package com.java.annotation;import java.lang..../*** Created by lw on 14-5-30.* 自定义注解*/@Documented@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface MethodInfo {...package com.java.annotation;
import java.lang.annotation.*;
/**
* Created by lw on 14-5-30.
* 自定义注解
*/
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodInfo {
public String Value() default "暂无说明";
}
/*
四个定义注解时候的限定数据
@Target(ElementType.TYPE) :接口、类、枚举、注解
@Target(ElementType.FIELD) :字段、枚举的常量
@Target(ElementType.METHOD) :方法
@Target(ElementType.PARAMETER) :方法参数
@Target(ElementType.CONSTRUCTOR) :构造函数
@Target(ElementType.LOCAL_VARIABLE) :局部变量
@Target(ElementType.ANNOTATION_TYPE):注解
@Target(ElementType.PACKAGE) :包
@Retention(RetentionPolicy.SOURCE) :在源文件中有效(即源文件保留)
@Retention(RetentionPolicy.CLASS) :在class文件中有效(即class保留)
@Retention(RetentionPolicy.RUNTIME) :在运行时有效(即运行时保留)
@Inherited:说明子类可以继承父类中的该注解
@Document:说明该注解将被包含在javadoc中
*/
package com.java.annotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
/**
* Created by lw on 14-5-30.
*/
public class Test {
/**
* 获取注解参数
*
* @param annotationClass 注解类
* @param annotationField 注解类字段名称
* @param aClass 使用注解的class名称
* @param methodName 使用注解的方法名称
* @throws Exception
*/
public static void getAnnotationPar(Class annotationClass, String annotationField, Class aClass, String methodName) throws Exception {
Method aClassMethod = aClass.getMethod(methodName);
Annotation annotation = aClassMethod.getAnnotation(annotationClass);
Method method = annotation.getClass().getDeclaredMethod(annotationField);
System.out.println(method.invoke(annotation));
}
public static void main(String[] args) throws Exception {
Test.getAnnotationPar(MethodInfo.class, "Value", Test2Annotation.class, "testMyAnnotation");
}
}
class Test2Annotation {
@MethodInfo(Value = "自定义的注解@MethodInfo")
public void testMyAnnotation() {
}
}
-
java反射获取注解上的参数值
2021-12-08 18:16:53最近写一个文档, 用到了一个导出类的属性释义, 但这些释义定义在导出类属性上的注解上, 如下 几十个字段好几个类, 一个个敲是自然万万不可,复制也太慢,最好是写个代码一锅端! 方案 此处用到了反射, 还有java....场景
最近写一个文档, 用到了一个导出类的属性释义, 但这些释义定义在导出类属性上的注解上, 如下
几十个字段好几个类, 一个个敲是自然万万不可,复制也太慢, 最好是写个代码一锅端!
方案
此处用到了反射, 还有java.lang下的两个方法
- java.lang.Package.isAnnotationPresent(Class<? extends Annotation> annotationClass)
- 如果指定类型的注释存在于此元素上, 方法返回true
- java.lang.Package.getAnnotation(Class< A > annotationClass)
- 如果是该类型的注释, 方法返回该元素的该类型的注释
实例
实体类TestExportVO
import java.io.Serializable; import java.lang.reflect.Field; import cn.afterturn.easypoi.excel.annotation.Excel; import io.swagger.annotations.ApiModel; import lombok.Data; @Data @ApiModel(value = "TestExportVO") public class TestExportVO implements Serializable { private static final long serialVersionUID = 1L; /** 姓名 */ @Excel(name = "姓名", width = 15) private String studentName; /** 身份证号 */ @Excel(name = "身份证号", width = 20) private String identityId; /** 学号 */ @Excel(name = "学号", width = 20) private String studentId; /** 出生日期 */ @Excel(name = "出生日期", width = 15) private String birthday; // ...... }
获取注释上的内容
public static void main(String[] args) { // 获取类注解 if(TestExportVO.class.isAnnotationPresent(ApiModel.class)){ System.out.println(TestExportVO.class.getAnnotation(ApiModel.class).value()); } // 获取类变量注解: Field[] fields = TestExportVO.class.getDeclaredFields(); for (Field f : fields) { if(f.isAnnotationPresent(Excel.class)){ System.out.print(f.getAnnotation(Excel.class).name() + ","); } } }
运行如下
扩展
获取方法上的注解
// 获取方法注解: Method[] methods = TestExportVO.class.getDeclaredMethods(); for (Method m : methods) { if(m.isAnnotationPresent(Excel.class)){ System.out.println(m.getAnnotation(Excel.class).name()); } }
获取方法参数上的注解
// 获取方法参数注解: Method[] methods2 = TestExportVO.class.getDeclaredMethods(); for (Method m : methods2) { // 获取方法的所有参数 Parameter[] parameters = m.getParameters(); for (Parameter p : parameters) { // 判断是否存在注解 if(p.isAnnotationPresent(Excel.class)){ System.out.println(p.getAnnotation(Excel.class).name()); } } }
- java.lang.Package.isAnnotationPresent(Class<? extends Annotation> annotationClass)
-
java自定义注解及获取注解参数
2019-02-09 21:20:05要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法。 元注解: 元注解的作用就是负责注解其他注解。Java5.0定义了4...以前不知道注解有什么用,现在学到了框架,发现到处都是注解。所以搞明白注解的原理还是很有必要的。
要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法。
元注解:
元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解:
1.@Target, 2.@Retention, 3.@Documented, 4.@Inherited
这些类型和它们所支持的类在java.lang.annotation包中可以找到。下面我们看一下每个元注解的作用和相应分参数的使用说明。
@Target:
@Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。
作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
取值(ElementType)有:
1.CONSTRUCTOR:用于描述构造器 2.FIELD:用于描述域 3.LOCAL_VARIABLE:用于描述局部变量 4.METHOD:用于描述方法 5.PACKAGE:用于描述包 6.PARAMETER:用于描述参数 7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
使用实例:
@Target(ElementType.TYPE) public @interface Table { /** * 数据表名称注解,默认值为类名称 * @return */ public String tableName() default "className"; } @Target(ElementType.FIELD) public @interface NoDBColumn { }
注解Table 可以用于注解类、接口(包括注解类型) 或enum声明,而注解NoDBColumn仅可用于注解类的成员变量。
@Retention:
@Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。
作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)Retention meta-annotation类型有唯一的value作为成员,它的取值来自java.lang.annotation.RetentionPolicy的枚举类型值。具体实例如下:
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Column { public String name() default "fieldName"; public String setFuncName() default "setField"; public String getFuncName() default "getField"; public boolean defaultDBValue() default false; }
Column注解的的RetentionPolicy的属性值是RUTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理
@Documented:
@Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Column { public String name() default "fieldName"; public String setFuncName() default "setField"; public String getFuncName() default "getField"; public boolean defaultDBValue() default false; }
@Inherited:
@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。
当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。
实例代码:
/** * * @author peida * */ @Inherited public @interface Greeting { public enum FontColor{ BULE,RED,GREEN}; String name(); FontColor fontColor() default FontColor.GREEN; }
自定义注解实例
自定义一个注解:
@Documented @Retention(RetentionPolicy.RUNTIME) @Inherited @Target(ElementType.METHOD)//注解作用于方法 public @interface MyAnnotation { String name()default "张三丰"; int abilityNum()default 1; String[] abilityNames()default {"太极拳"}; }
测试代码:测试是否能获取注解的参数
public class TestAnnotation { @MyAnnotation(name="令狐冲",abilityNum=2,abilityNames= {"独孤九剑","吸星大法"}) public void people1(String name,int age) { } @MyAnnotation(name="段誉",abilityNum=2,abilityNames= {"凌波微步","六脉神剑"}) public void people2(String name,int age) { } @MyAnnotation //没有配置,则使用默认值 public void people3(String name,int age) { } public static void main(String[] args){ Method[] methods=TestAnnotation.class.getMethods();//反射获取所有方法 for(Method m:methods) { //遍历所有方法 if(m.isAnnotationPresent(MyAnnotation.class)) {//判断方法是否有MyAnnotation注解 MyAnnotation myAnno=m.getAnnotation(MyAnnotation.class); System.out.print(myAnno.name()+"有" +myAnno.abilityNum()+"个技能: "); for(String abilityName:myAnno.abilityNames()) { System.out.print(abilityName+" "); } System.out.println(); } } } }
输出结果:
段誉有2个技能: 凌波微步 六脉神剑 令狐冲有2个技能: 独孤九剑 吸星大法 张三丰有1个技能: 太极拳
-
java 获取类,属性变量,方法,方法参数上注解的值等
2021-03-08 10:55:55一:获取类上注解的值定义注解@Target(ElementType.TYPE)用于类,接口等@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface Orange {String getName();String getValue();}获取@Orange... -
java注解校验参数
2020-09-29 08:23:33JSR303规范提供了一系列的参数校验注解帮我们解决常见的参数校验 首先需要在我们的pom.xml文件中引入相关依赖 <dependency> <groupId>javax.validation</groupId> <artifactId>... -
java反射之获取类、方法、方法参数、类参数注解
2021-02-12 16:51:57packagecom.wh.pj1.test...importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;importjava.lang.refle... -
Java中自定义注解进行参数验证
2021-11-10 19:21:54Java自定义参数验证注解 -
获取注解里面的参数
2021-03-07 10:53:08package ...import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Inherited;import java.lang.annotation.Retention;import ja... -
java 获取类,属性变量,方法,方法参数上注解的值
2019-06-15 16:08:41一:获取类上注解的值 定义注解@Target(ElementType.TYPE)用于类,接口等 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Orange { String getName(); String getValue... -
Java如何获取所有注解?
2021-03-08 05:52:15要获取类,方法,构造函数或字段的所有注释,我们使用getAnnotations()方法。此方法返回一个数组Annotation在以下示例中,我们尝试从该sayHi()方法读取所有注释。首先,我们需要获取自身的方法对象。因为sayHi()方法... -
java 自定义注解以及获得注解的值
2021-12-06 18:45:431.自定义注解 复制代码 import java.lang.annotation.*; @Documented @Target(ElementType.FIELD) @Inherited @Retention(RetentionPolicy.RUNTIME ) public @interface MyAnno { /** * 是否能为null * @return */ ... -
java自定义注解实现获取调用本地方法时相关参数
2021-10-13 16:51:071.定义注解-LocalMethod @Target(value = {ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface LocalMethod { String uid() default ""; } 2.定义注解切入处理逻辑 ... -
Java注解动态解析获取方法参数值
2021-09-02 15:59:40那么就涉及到了 在注解中动态解析形参中的值 # 1. 使用方式 - 提供resolverContent方法进行解析内容 - 比如解析 String contextEL = "用户名:+#{user.username}+,用户密码:+#{user.password -
AOP中获取自定义注解的参数值
2021-03-14 18:16:37目录1.5、测试2.5、测试三、总结一、利用注解实现AOP的基本流程如果特别熟悉自定义注解实现AOP,可以直接转到第二部分:跳转。Spring中,可以通过自定义注解的方式来实现AOP,比较简单,流程如下:1.1、创建一个注解... -
Java如何快速获取类附带的注解
2021-02-12 14:11:49作者: 一字马胡转载标志 【2018-01-04】更新日志日期更新内容备注2018-01-04创建分析文档java技术干货分享Java技术干货分享如何快速获取或者判断一个类是否有某个注解呢?可以使用对象的Class信息来获取,下面是一... -
java SpringBoot自定义注解,及自定义解析器实现对象自动注入操作
2020-08-24 20:37:50主要介绍了java SpringBoot自定义注解,及自定义解析器实现对象自动注入操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 -
java 获取类,属性变量,方法,方法参数上注解
2019-07-12 17:22:56一:获取类上注解的值 定义注解@Target(ElementType.TYPE)用于类,接口等 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Orange { String getName(); String getValue(); } ... -
Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)
2020-12-19 10:27:34在接口中须要作不少的参数校验,本着简洁、高效的原则,便写了这个小工具供本身使用(内容为缩减版,具体业务可自行扩展)app思路:使用Java反射机制,读取实体类属性头部注解,经过get方法获取参数值进行校验,若是为... -
java如何获取加注解的类和注解的属性值
2019-03-27 20:11:32在java中,如果我们对一个类或者方法加了注解,那么是可以获取到这个注解的属性值的,最明显的例子就是在springMVC中,当我们使用 @RequestMapping(value="") 的时候,spring会将我们填写的value值当作路径存放在map... -
Java 在运行时修改注解参数值
2020-10-25 17:14:44Java 在运行时修改注解参数值 注解是在java代码中增加一种元数据,这些元数据可以嵌入在class文件中在编译时处理,也可以保留至运行时通过Reflection进行访问。本文讨论如何在运行时修改注解值,我们示例使用类级别... -
Java 通过反射获取类上注解,方法上注解,注解里的值及方法参数
2020-03-24 09:17:28此类为本人开发的工具类,具体应用在什么地方呢。本人在实际项目中,权限管理这一块有所应用,应该是权限这一块有所需求而开发的。 应用场景说明:权限资源自动化生产时,用户点击界面的一键生成资源时,接口中就会... -
Java自定义注解进行参数校验
2020-05-25 12:57:50Java自定义注解 关于自定义注解的使用方法和原理,以及通过自定义注解进行参数校验 -
Java 实体类中对字段添加非空注解判断传入的参数是否为空
2022-04-01 11:20:26pom文件添加依赖 <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId>...1. 创建实体类并且添加非空注解 在此说明 lomboo -
java 注解annotation的使用以及反射如何获取注解
2021-02-28 12:42:501. Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是接口.2. 参数成员只能用public或默认(default)这两个访问权修饰3. 参数成...