• JAVA类型信息——反射机制


                JAVA类型信息——反射机制

    一、反射机制概述

        1、反射机制:就是java语言在运行时拥有的一项自我观察的能力,java通过这种能力彻底了解程序自身的情况,并为下一步的动作做准备。

        2、反射机制的功能

           1) 在运行时判断任意一个对象所属的类。

           2) 在运行时构造任意一个类的对象(新建类的实例)      

    3) 在运行时判断任意一个类所具有的成员变量和方法。

           4) 在运行时调用任意一个对象的方法。

        3、反射机制的支持

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

          

    类名

    功能概述

    AccessibleObject

    该类是域(field)对象、方法(method)对象、构造函数(constructor)对象的基础类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。

    Array

    提供动态地生成和访问JAVA数组的方法

    Constructor

    提供一个类的构造函数的信息以及访问类的构造函数的接口。

    Field

    提供一个类的域的信息以及访问类的域的接口。

    Method

    提供一个类的方法的信息以及访问类的方法的接口。

    Modifier

    提供了 static 方法和常量,对类和成员访问修饰符进行解码。

    Proxy

    提供动态地生成代理类和类实例的静态方法。

    ReflectPermision

    指定权限。

     

     

     

        4、获取Class对象的三种方法

    方法

    实例

    ObjectgetClass()

    MyObject ob_aMyObject;

    Class ob_aClass = ob_aMyObject.getClass();

    Class.forName()

    Class ob_bClass = Class.forName(“MyObject”);

    类字面常量 .class

    Class ob_cClass = MyObject.class;

     

     

     

        5Method(方法对象)

    方法

    功能

    getMethods()

    获得类的所有公共方法列表。

    getMethod(String name, Class[] params)

    使用特定的参数类型,获得命名的公共方法

    getDexlaredMethods()

    获取类中定义了的方法列表。

    getDeclaredMethod(String name, Class[] params)

    使用特写的参数类型,获得类声明的命名的方法

     

     

     

        6Constructor(构造器对象)

    方法

    功能

    getConstructors()

    无参,获得类的所有公共构造函数列表。

    getConstructors(

    Class[] prarams)

    获得使用特殊的参数类型的公共构造函数列表。

    getDeclaredConstructors(

    Class[] prarams)

    获得使用特定参数类型的公共构造函数(与接入级别无关)

    getDeclaredConstructors()

    获得类的所有构造函数(与接入级别无关)列表。

     

     

     

    7Field(属性对象)

    方法

    功能

    getField(String name)

    获得命名的公共字段

    getFields()

    获得类的所有公共字段列表。

    getDeclaredField(String name)

    获得类声明的命名的字段。

    getDeclaredFields()

    获得类声明的所有字段列表。

     

     

     

    二、应用举例

    1、获取系统Date类的方法

    import java.lang.reflect.Method;

    public class DateMethodsRtti {

          public static void main(String[] args) throws Exception {

                 Class<?> ob_aClass = Class.forName("java.util.Date");

                 Method[] ob_aMethod_Array = ob_aClass.getDeclaredMethods();

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

                        System.out.println(ob_aMethod_Array[i].toString());

                 }

          }

    }

           运行结果:显示Date所有的方法。

    2、下例中的copy()显示了创建一个与参数对象具有同样类型的对象,并且把参数对象中的所有属性拷贝到新建的对象中。

    class Customer{

          private Long id;

          private String name;

          private int age;

          public Customer() {}

          public Customer(String name, int age) {

                 this.name = name;

                 this.age = age;

          }

          public Long getId() {return id;}

          public void setId(Long id) {this.id = id;}

          public String getName() {return name;}

          public void setName(String name) {this.name = name;}

          public int getAge() {return age;}

          public void setAge(int age) {this.age = age;}

    }

     

    public class ReflectTester {

        public Object copy(Object object) throws Exception{

             //获得对象的类型。

             Class<?> ob_aClass = object.getClass();

             System.out.println("Class : " + ob_aClass.getName());

             //通过默认构造方法创建一个新的对象。

          Object ob_aObject = ob_aClass.getConstructor(new Class[] {}).newInstance(new Object[] {});

             //获得对象的所有属性

             Field[] ob_aField_Array = ob_aClass.getDeclaredFields(); 

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

                    Field ob_aField = ob_aField_Array[i];

                    String fieldName = ob_aField.getName();

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

                        //获得和属性对应的getXXX()方法的名字

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

                    //获得和属性对应的setXXX()方法的名字

            String setMethodName = "set" + firstLetter + fieldName.substring(1);

                    //获得和属性对应的getXXX()方法

              Method getMethod = ob_aClass.getMethod(getMethodName, new Class[] {});

                    //获得和属性对应的setXXX()方法

              Method setMethod = ob_aClass.getMethod(setMethodName,  new Class[] {ob_aField.getType()});

                    //调用远对象的getXXX()方法

              Object ob_bObject = getMethod.invoke(object,                      new Object[] {} );

                    System.out.println(fieldName + ":" + ob_bObject);

                    setMethod.invoke(ob_aObject, new Object[] {ob_bObject});

             }

             return ob_aObject ;

        }

          public static void main(String[] args) throws Exception{

                 Customer ob_aCustomer = new Customer("Tom", 21);

                 ob_aCustomer.setId(new Long(1));

           Customer ob_bCustemer = (Customer)

    new ReflectTester().copy(ob_aCustomer);

           System.out.println("Copy information :" + ob_bCustemer.getId() + "  " + ob_bCustemer.getName() + "  " + ob_bCustemer.getAge());

          }

    }

    运行结果:

    Class : rtti.Customer

    id:1

    name:Tom

    age:21

    Copy information :1  Tom  21

    网络文章推荐:http://blog.chinaunix.net/uid-24337578-id-177320.html

                  http://www.cnblogs.com/Quincy/archive/2011/06/19/2084557.html

     

     

     

     

     

     

  • 相关阅读:
    174. Dungeon Game
    240. Search a 2D Matrix II
    300. Longest Increasing Subsequence
    test markdown style
    多源多汇费用流——poj2516
    费用流消圈算法(构造残量网络)
    费用流模板(带权二分图匹配)——hdu1533
    最大流模板——进阶指南整理
    最大流任务调度+离散化——hdu2883
    最大流拆点——hdu2732,poj3436
  • 原文地址:https://www.cnblogs.com/xuemaxiongfeng/p/3279226.html
Copyright © 2020-2023  润新知