`

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反射、注解及泛型模拟ORM实现

    这篇博文“利用java反射、注解及泛型模拟ORM实现”旨在探讨如何结合这三种技术来实现对象关系映射(ORM),这是一种将数据库表与Java对象之间进行绑定的技术,简化了数据操作。 首先,我们来理解一下这三个概念: ...

    java反射经典实例

    在本“Java反射经典实例”中,我们将深入探讨这个主题,了解如何利用反射来访问和修改私有属性以及调用私有方法。 1. **反射的概念与用途** - 反射机制是在运行时分析类的能力,它允许我们获取类的信息(如类名、...

    java反射实例代码

    在提供的"java反射实例代码"中,应该包含了如何使用上述方法的实际示例,这些示例有助于加深对Java反射机制的理解。通过阅读和运行这些代码,开发者可以更直观地学习如何在程序运行时动态地操作类、方法和字段,从而...

    Java 8个反射实例

    以下将详细介绍Java反射的8个关键实例。 1. 获取Class对象 要使用反射,首先需要获取到目标类的Class对象。这可以通过以下几种方式实现: - 使用`Class.forName()`方法,如`Class&lt;?&gt; clazz = Class.forName("全...

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

    关于Java反射的实例,我们可以创建一个简单的例子。假设我们有一个接口`Service`和两个实现类`ServiceImpl1`、`ServiceImpl2`。在不使用反射的情况下,我们通常会通过new关键字创建服务对象。而通过反射,可以在运行...

    Java注解与反射原理说明

    当注解与反射结合时,我们可以利用反射机制来读取和处理注解中的信息。在Java中,`AnnotatedElement`接口提供了获取注解的方法,包括`getAnnotations()`和`getAnnotation(Class&lt;T&gt; annotationClass)`。 1. `...

    Java反射动态修改注解的某个属性值.Java

    Java反射是Java编程语言中的一个强大工具,它允许运行中的程序检查并操作其他类、对象、方法等。在Java中,注解(Annotation)是一种元数据,提供了在编译时和运行时对代码进行信息注解的方式。这些注解可以用于代码...

    Java反射实例源码

    标题"Java反射实例源码"表明我们将探讨如何通过源代码来实现和理解Java反射。这个实例可能包含了如何动态地创建对象、调用方法、访问字段和执行构造器的示例。 描述中提到的博客文章"菜鸟学编程(九)——Java反射...

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

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

    java 自定义注解的实例详解

    在本文中,我们将详细介绍 Java 自定义注解的实例详解,包括如何创建自定义注解、如何使用反射来获取注解信息 oraz 如何使用自定义注解来实现特定的功能。 一、Java 注解的基本概念 Java 注解是一种特殊的标记,它...

    Java反射实例

    `isAnnotationPresent(Class&lt;? extends Annotation&gt; annotationClass)`检查类、方法或字段是否包含指定的注解,`getAnnotation(Class&lt;? extends Annotation&gt; annotationClass)`获取注解实例。 7. **安全性与效率** ...

    使用反射和注解模拟Spring的依赖注入

    在Java编程中,Spring...总的来说,理解和掌握反射与注解对于深入学习Spring框架至关重要。通过模拟Spring的依赖注入,开发者可以更好地领悟到IoC和DI的核心思想,从而在实际开发中更有效地利用Spring框架提供的功能。

    Java反射机制总结(实例分析)

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作。通过反射,开发者可以在程序执行时发现并访问类的字段(fields)、方法(methods)以及构造器(constructors),...

    java反射实例

    5. **泛型与反射**:尽管Java反射不直接支持泛型类型,但可以通过方法签名或类的类型参数来间接获取泛型信息。 6. **访问限制与安全**:反射可以访问私有成员,但这可能会破坏封装性,因此在使用时需谨慎。此外,...

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

    Java 自定义注解及利用反射读取注解的实例 Java 中的注解(Annotation)是一种元数据,用于提供有关程序元素的信息,而不影响程序的执行。Java 中提供了多种元注解,包括 @Target、@Retention、@Documented、@...

    Java反射、泛型和注解实战之Spring核心注入IOC的实现

    通过这个实战项目,你可以深入理解Java反射、泛型和注解的用法,并且了解到如何利用它们构建一个基本的依赖注入系统,这将有助于你更好地理解和使用Spring框架。同时,这样的实践也有助于提升你的编程技能,使你能够...

    java反射应用实例

    在标题“Java反射应用实例”中,我们关注的是如何在实际项目中利用反射来实现特定的功能。这篇博客文章(可以通过链接访问)可能会探讨以下几个方面: 1. **什么是反射**:首先,我们需要理解反射的基本概念。反射...

    java反射-英文版反射规范

    ### Java反射机制详解 #### 一、概述 Java反射机制是一种强大的编程技术,它允许运行时检查类的信息并操作对象的内部结构。本篇将基于Sun公司的官方文档《Java™ Core Reflection API and Specification》(1997年...

    java 反射ppt 和 code 示例

    通过这份资料,开发者不仅可以理解Java反射的基本概念,还能通过实例学习到反射在实际项目中的应用技巧,提升编程的灵活性和可扩展性。同时,对反射的深入理解和正确使用,也能帮助解决很多设计模式和框架中的核心...

Global site tag (gtag.js) - Google Analytics