精华内容
下载资源
问答
  • java注解获取请求参数
    千次阅读
    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 通过反射获取类注解,方法上注解注解里的值及方法参数,项目为maven项目。导入时记得选择maven项目
  • package 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自定义注解及获取注解参数

    万次阅读 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个技能: 太极拳 

     

    展开全文
  • 一:获取类注解的值定义注解@Target(ElementType.TYPE)用于,接口等@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface Orange {String getName();String getValue();}获取@Orange...
  • java注解校验参数

    千次阅读 2020-09-29 08:23:33
    JSR303规范提供了一系列的参数校验注解帮我们解决常见的参数校验 首先需要在我们的pom.xml文件中引入相关依赖 <dependency> <groupId>javax.validation</groupId> <artifactId>...
  • packagecom.wh.pj1.test...importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;importjava.lang.refle...
  • Java自定义参数验证注解
  • 获取注解里面的参数

    千次阅读 2021-03-07 10:53:08
    package ...import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Inherited;import java.lang.annotation.Retention;import ja...
  • 一:获取类注解的值 定义注解@Target(ElementType.TYPE)用于,接口等 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Orange { String getName(); String getValue...
  • 获取类,方法,构造函数或字段的所有注释,我们使用getAnnotations()方法。此方法返回一个数组Annotation在以下示例中,我们尝试从该sayHi()方法读取所有注释。首先,我们需要获取自身的方法对象。因为sayHi()方法...
  • 1.自定义注解 复制代码 import java.lang.annotation.*; @Documented @Target(ElementType.FIELD) @Inherited @Retention(RetentionPolicy.RUNTIME ) public @interface MyAnno { /** * 是否能为null * @return */ ...
  • 1.定义注解-LocalMethod @Target(value = {ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface LocalMethod { String uid() default ""; } 2.定义注解切入处理逻辑 ...
  • 那么就涉及到了 在注解中动态解析形参中的值 # 1. 使用方式 - 提供resolverContent方法进行解析内容 - 比如解析 String contextEL = "用户名:+#{user.username}+,用户密码:+#{user.password
  • 目录1.5、测试2.5、测试三、总结一、利用注解实现AOP的基本流程如果特别熟悉自定义注解实现AOP,可以直接转到第二部分:跳转。Spring中,可以通过自定义注解的方式来实现AOP,比较简单,流程如下:1.1、创建一个注解...
  • 作者: 一字马胡转载标志 【2018-01-04】更新日志日期更新内容备注2018-01-04创建分析文档java技术干货分享Java技术干货分享如何快速获取或者判断一个是否有某个注解呢?可以使用对象的Class信息来获取,下面是一...
  • 主要介绍了java SpringBoot自定义注解,及自定义解析器实现对象自动注入操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 一:获取类注解的值 定义注解@Target(ElementType.TYPE)用于,接口等 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Orange { String getName(); String getValue(); } ...
  • 在接口中须要作不少的参数校验,本着简洁、高效的原则,便写了这个小工具供本身使用(内容为缩减版,具体业务可自行扩展)app思路:使用Java反射机制,读取实体属性头部注解,经过get方法获取参数值进行校验,若是为...
  • java中,如果我们对一个或者方法加了注解,那么是可以获取到这个注解的属性值的,最明显的例子就是在springMVC中,当我们使用 @RequestMapping(value="") 的时候,spring会将我们填写的value值当作路径存放在map...
  • Java 在运行时修改注解参数

    千次阅读 2020-10-25 17:14:44
    Java 在运行时修改注解参数值 注解是在java代码中增加一种元数据,这些元数据可以嵌入在class文件中在编译时处理,也可以保留至运行时通过Reflection进行访问。本文讨论如何在运行时修改注解值,我们示例使用级别...
  • 此类为本人开发的工具,具体应用在什么地方呢。本人在实际项目中,权限管理这一块有所应用,应该是权限这一块有所需求而开发的。 应用场景说明:权限资源自动化生产时,用户点击界面的一键生成资源时,接口中就会...
  • Java自定义注解进行参数校验

    千次阅读 2020-05-25 12:57:50
    Java自定义注解 关于自定义注解的使用方法和原理,以及通过自定义注解进行参数校验
  • pom文件添加依赖 <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId>...1. 创建实体并且添加非空注解 在此说明 lomboo
  • 1. Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的或是接口.2. 参数成员只能用public或默认(default)这两个访问权修饰3. 参数成...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 237,783
精华内容 95,113
关键字:

java获取类注解的参数

java 订阅