`

JAVA反射与注解实例

阅读更多

JAVA反射与注解实例

1    JAVA反射机制

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。或者说,JAVA反射机制指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

2       JAVA 注解

Annotation(注解)是JDK5.0及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过反射机制编程实现对这些元数据(用来描述数据的数据)的访问。另外,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件、或者运行时中出现(SOURCE/CLASS/RUNTIME)。

3       注解BEAN

自定义注解类,如下:

@Retention(RetentionPolicy.RUNTIME)

public @interface PropertyInfoAnnotation {

       public String code();   // 代码

       public String name(); // 名称

       public long orderNo();// 排序顺序号

};

简单JAVA BEAN如下:

public class BaseMeasureData {

       @PropertyNameAnnotation(code="IN",name="指标代码",orderNo=1)

    private String iN;

       @PropertyNameAnnotation(code="DN",name="维度",orderNo=2)

       private String dN;

       @PropertyNameAnnotation(code="VV",name="数据值",orderNo=3)

    private String vV;

    public String getIN() {

              return iN;

       }

       public void setiN(String iN) {

              this.iN = iN;

       }

       public String getDN() {

              return dN;

       }

       public void setdN(String dN) {

              this.dN = dN;

       }

       public String getVV() {

              return vV;

       }

       public void setvV(String vV) {

              this.vV = vV;

       }

4       注释帮助类

注释管理器,作为访问注释信息的入口,如下:

public class PropertyHelper {

       // 用于禁止在类外部用构造函数实例化该类。

       private PropertyHelper() {

             

       }

       private static PropertyHelper instance=new PropertyHelper();

       public static PropertyHelper getInstance(){

              return instance;

       }

       private Map<Class,Map<String,Long>> beanCachePropertyCodeMap=new HashMap<Class,Map<String,Long>>();

      

       /**

        * 获取属性代码及排序顺序号。

        * @param bean

        * @return

        */

       public Map<String,Long> getBeanPropertyCode(Object bean){

              Map<String,Long> result=null;

              result=(Map<String,Long>)this.beanCachePropertyCodeMap.get(bean.getClass());

              if(result!=null)

                     return result;

              else{

                     result=this.propertyCodeParse(bean);

                     this.beanCachePropertyCodeMap.put(bean.getClass(), result);

              }

              return result;

       }

       /**

        * 将类的属性代码及排序顺序号保存到内存对象。

        * @param bean

        * @return

        */

       private Map<String,Long> propertyCodeParse(Object bean){

              Map<String,Long> result=null;

              if(bean==null)

                     return null;

              Field[] fields=bean.getClass().getDeclaredFields();

              if ( fields == null) {

                     return null;

              }

              result=new HashMap<String,Long>(fields.length);

              for (Field field : fields) {

                     if (field.isAnnotationPresent(PropertyNameAnnotation.class)) {

                            PropertyNameAnnotation annotation=field.getAnnotation(PropertyNameAnnotation.class);

                            result.put(annotation.code(), Long.valueOf(annotation.orderNo()));

                     }

              }

              return result;

       }

       /**

        * 获取排序的属性代码。

        * @return

        */

       public String[] getOrderedCode(Object bean) {

              final Map<String,Long> map = getInstance().getBeanPropertyCode(bean);

              Set<String> set = map.keySet();

              String [] result = set.toArray(new String[set.size()]);

              Arrays.sort(result, new Comparator<Object>(){

                     public int compare(Object o1, Object o2) {

                            return map.get(o1).compareTo(map.get(o2));

                     }

              });

              return (String[])result;

       }

};

5       反射与注释应用

private void getObjPro(Object obj, Map dataMap, String className) {

   Class clas; 

   if (obj == null) { 

      clas = Class.forName(className); 

      obj = clas.newInstance(); 

   } else { 

      clas = Class.forName(obj.getClass().getName()); 

   } 

   //得到obj类的所有属性 

   Field[] fileds = clas.getDeclaredFields();

   for (Field field : fileds) {

      String fieldName = field.getName();

      String fieldType = field.getType().getName();

      PropertyNameAnnotation annotation=field.getAnnotation(PropertyNameAnnotation.class);

      if (null == annotation) {

         return ;

      }

      String propertyCode = annotation.code();

        // 属性名的第一个字母大写,与get或者is组成方法名

        String firstCharUpper = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1, fieldName.length()); 

        Method method;

        //如果是boolean型则方法名为is*;反之为get* 

        if (isBooleanType(fieldType)) { 

           method = clas.getMethod("is" + firstCharUpper, null); 

        } else { 

           method = clas.getMethod("get" + firstCharUpper, null); 

        } 

        if (isSysDefinedType(fieldType)) {

           //如果是系统类型则添加进入map

           String formatDateStr = isTimeType(fieldType, method, obj); 

           if (formatDateStr != null) { 

             dataMap.put(propertyCode, formatDateStr);

             continue; 

           }

           dataMap.put(propertyCode, method.invoke(obj, null) == null ? "" : method.invoke(obj, null));  //执行方法,将结果保存到dataMap。

        }

    }

}

分享到:
评论

相关推荐

    Java 自定义注解及利用反射读取注解的实例

    下面小编就为大家带来一篇Java 自定义注解及利用反射读取注解的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    通过Java反射机制获取JavaBean对象

    1.通过Java反射机制获取JavaBean对象。 2.通过JavaBean全路径字符串获取JavaBean对象。 3.获取JavaBean注解信息

    Spring IOC 原理 ,Java 反射实例,自定义注解

    NULL 博文链接:https://zyqwst.iteye.com/blog/2255560

    java注解之运行时修改字段的注解值操作

    主要介绍了java注解之运行时修改字段的注解值操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    Java高级程序设计实战教程第三章-Java反射机制.pptx

    常见的应用如下 逆向代码 ,例如反编译 与注解相结合的框架 例如Retrofit 单纯的反射机制应用框架 例如EventBus 2.x 动态生成类框架 例如Gson Java高级程序设计实战教程第三章-Java反射机制全文共15页,当前为第8页...

    Java使用注解和反射简化编程的方法示例

    主要介绍了Java使用注解和反射简化编程的方法,结合实例形式分析了java使用注解和反射调用大量函数简化编程的相关操作技巧,需要的朋友可以参考下

    浅谈java反射和自定义注解的综合应用实例

    本篇文章主要介绍了java反射和自定义注解的综合应用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Java基于反射机制实现全部注解获取的方法示例

    主要介绍了Java基于反射机制实现全部注解获取的方法,结合实例形式分析了java反射机制获取注解的具体实现方法与操作注意事项,需要的朋友可以参考下

    IoC容器的设计(利用反射、注解和工厂模式实现)

    1. 利用注解、反射和工厂模式设计一个简单的IoC容器 2. 该IoC容器包含3个注解和一个IoC容器类(AnnotationConfigApplicationContext),其定义如下: 注解 含义 @Component 标注Bean @Autowired 标注需要被注入的...

    Java利用自定义注解、反射实现简单BaseDao实例

    下面小编就为大家带来一篇Java利用自定义注解、反射实现简单BaseDao实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Java通过反射访问注解信息的方法示例

    主要介绍了Java通过反射访问注解信息的方法,结合实例形式分析了java基于反射访问类成员方法注解信息的相关操作技巧,需要的朋友可以参考下

    Java反射机制与框架原理

    这是『Java学习指南系列』的第18篇教程 ,是Java开发的高级课程,介绍反射机制、注解和框架设计的一般性原理。 二、主要内容  本篇包含以下内容: * 使用反射机制,读取Class中的字段信息 * 使用反射机制,对...

    通过反射获得实体类的字段和值

    通过反射获得实体类的字段和值

    day021-反射和注解笔记和代码.rar

    Class 类的实例表示正在运行的 Java 应用程序中的类和接口; 枚举是一种类,注解(指的是注解Annotation)是一种接口; 每个数组都是 Class字节码类中的一个具体 对象 基本的 Java 类型(boolean、byte、...

    Java基础 反射篇.md

    Java基础 反射篇 - Java基础 反射篇 - 反射的思想及作用 - 反射的基本使用 - 获取类的 Class 对象 - 构造类的实例化对象 - 获取一个类的所有信息 - 获取类中的变量(Field) - 获取类中的方法(Method) - ...

    java深度历险

    JAVA反射与动态代理 40 基本用法 40 处理泛型 42 动态代理 42 使用案例 43 参考资料 44 JAVA I/O 45 流 45 缓冲区 47 字符与编码 48 通道 49 参考资料 52 JAVA安全 53 认证 53 权限控制 55 加密、解密与签名 57 安全...

    《剑指offer》Java基础-反射篇.pdf

    Java基础 反射篇 反射的思想及作用 反射的基本使用 获取类的 Class 对象 构造类的实例化对象 获取一个类的所有信息 获取类中的变量(Field) 获取类中的方法(Method) 获取类的构造器(Constructor) 获取注解 通过...

    Java注解学习讲义.docx

    注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。...· 运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例。

    Java 基础核心总结 +经典算法大全.rar

    与 Exception 有关的 Java 关键字 throws 和 throw try 、finally 、catch 什么是 Error 内部类 创建内部类集合 Iterable 接口顶层接口 ArrayList Vector LinkedList 类Stack HashSet TreeSet LinkedHashSet 类 ...

    java基础案例与开发详解案例源码全

    15.2 使用Java反射机制414 15.2.1 获取类型信息414 15.2.2 创建对象417 15.2.3 调用方法419 15.2.4 访问成员变量的值421 15.2.5 操作数组422 15.3 反射与动态代理424 15.3.1 静态代理424 15.3.2 动态代理426 15.4 本...

Global site tag (gtag.js) - Google Analytics