zoukankan      html  css  js  c++  java
  • java自定义注解与反射

    java注解与反射
    一、Java中提供了四种元注解,专门负责注解其他的注解,分别如下
      1、@Retention元注解,表示需要在什么级别保存该注释信息(生命周期)。可选的RetentionPoicy参数包括:
        RetentionPolicy.SOURCE: 停留在java源文件,编译器被丢掉
        RetentionPolicy.CLASS:停留在class文件中,但会被VM丢弃(默认)
        RetentionPolicy.RUNTIME:内存中的字节码,VM将在运行时也保留注解,因此可以通过反射机制读取注解的信息
      2、@Target元注解,默认值为任何元素,表示该注解用于什么地方。可用的ElementType参数包括
        ElementType.CONSTRUCTOR: 构造器声明
        ElementType.FIELD: 成员变量、对象、属性(包括enum实例)
        ElementType.LOCAL_VARIABLE: 局部变量声明
        ElementType.METHOD: 方法声明
        ElementType.PACKAGE: 包声明
        ElementType.PARAMETER: 参数声明
        ElementType.TYPE: 类、接口(包括注解类型)或enum声明
      3、@Documented将注解包含在JavaDoc中
      4、@Inheried允许子类继承父类中的注解
    二、注解的定义
      1、注解定义的格式
        public @interface FieldMeta {}

    package com.http.model;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.Retention;
    import java.lang.annotation.Target;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.ElementType;
    
    @Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到  
    @Target({ElementType.FIELD})//定义注解的作用目标**作用范围字段、枚举的常量/方法  
    @Documented//说明该注解将被包含在javadoc中
    public @interface FieldMeta {
        String name() default ""; 
        String description() default "";
    } 


      2、注解在实体类中的应用
        @FieldMeta(name="序列号",description="")
        private String id;
        @FieldMeta(name="姓名",description="")
        private String title;

    package com.http.model;
    
    public class ModelTest {
        @FieldMeta(name="序列号",description="")
        private String    id;
        @FieldMeta(name="标题",description="标题信息描述")  
        private String    title;
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
        public String getTitle() {
            return title;
        }
        public void setTitle(String title) {
            this.title = title;
        }
    }

    三、注解的遍历反射

        //反射获取对象属性名称及注解信息
        public static void getField(){       
            try {
                Class clazz= Class.forName("com.http.model.HttpRequest");
                Field[] field=clazz.getDeclaredFields();
                //System.out.println(field.length);
                for(Field f:field){
                    boolean isExist=f.isAnnotationPresent(FieldMeta.class);
                    if(isExist){
                        FieldMeta tt=f.getAnnotation(FieldMeta.class);
                        System.out.println("--注解:"+tt.id()+"  "+tt.name());
                    }
                    System.out.println(f.getName());
                }
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
        }
        

      //反射获取对象方法名称
      public static void getMethod(){ try { Class clazz = Class.forName("com.http.model.HttpRequest"); Method[] method=clazz.getDeclaredMethods(); System.out.println(method.length); for(Method f:method){ System.out.println(f.getName()); //获取方法名 } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
  • 相关阅读:
    Linq to OBJECT延时标准查询操作符
    LINQ to XML
    动态Linq(结合反射)
    HDU 1242 dFS 找目标最短路
    HDu1241 DFS搜索
    hdu 1224 最长路
    BOJ 2773 第K个与m互质的数
    ZOJ 2562 反素数
    2016 ccpc 杭州赛区的总结
    bfs UESTC 381 Knight and Rook
  • 原文地址:https://www.cnblogs.com/web369/p/4729111.html
Copyright © 2011-2022 走看看