java反射|Reflection详解

来源:互联网 发布:巴特尔cba数据 编辑:程序博客网 时间:2024/05/01 18:18

 反射是JDK5.0提供的java新特性,反射的出现打破了java一些常规的规则,如,私有变量不可访问。

  简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息。 

一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。这种“看透class”的能力(the ability of the program to examine itself)被称为introspection(内省、内观、反省)。Reflection和introspection是常被并提的两个术语

API简介

     在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中

Class类:代表一个类。

Field 类:代表类的成员变量(成员变量也称为类的属性)。

Method类:代表类的方法

Constructor 类:代表类的构造方法

Array类:提供了动态创建数组,以及访问数组的元素的静态方法

      



   /**

          * 根据属性名获取属性值

          * */

   private Object getFieldValueByName(String fieldName, Object o) {

       try { 

           String firstLetter = fieldName.substring(0, 1).toUpperCase(); 

           String getter = "get" + firstLetter +fieldName.substring(1); 

           Method method = o.getClass().getMethod(getter, new Class[] {}); 

           Object value = method.invoke(o, new Object[] {}); 

           return value; 

       } catch (Exception e) { 

           log.error(e.getMessage(),e); 

           return null; 

       } 

    }

   

   /**

    * 获取属性名数组

    * */

   private String[] getFiledName(Object o){

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

        String[]fieldNames=new String[fields.length];

             for(int i=0;i<fields.length;i++){

                       System.out.println(fields[i].getType());

                       fieldNames[i]=fields[i].getName();

             }

             return fieldNames;

    }

   

   /**

    * 获取属性类型(type),属性名(name),属性值(value)map组成的list

    * */

   private List getFiledsInfo(Object o){

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

        String[] fieldNames=newString[fields.length];

        List list = new ArrayList();

        Map infoMap=null;

             for(int i=0;i<fields.length;i++){

                       infoMap = new HashMap();

                       infoMap.put("type",fields[i].getType().toString());

                       infoMap.put("name",fields[i].getName());

                       infoMap.put("value",getFieldValueByName(fields[i].getName(), o));

                       list.add(infoMap);

             }

             return list;

    }

   

   /**

    * 获取对象的所有属性值,返回一个对象数组

    * */

   public Object[] getFiledValues(Object o){

             String[]fieldNames=this.getFiledName(o);

             Object[] value=newObject[fieldNames.length];

             for(int i=0;i<fieldNames.length;i++){

                       value[i]=this.getFieldValueByName(fieldNames[i],o);

             }

             return value;

    }       

原创粉丝点击