• 源码详解Java的反射机制


    理理java的基础,反射机制。

    先看原理:
    定义,JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。


    和大多定义一样,就是让人必须一字字斟酌才懂,简单的说,java反射机制的意思就是 通过名称得到对象(类、属性、方法)的技术。

    提供如下功能:

    在运行时判断任意一个对象所属的类。
    在运行时构造任意一个类的对象。
    在运行时判断任意一个类所具有的成员变量和方法。

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

    这时候,可能有的人会顿悟了,原来自己一直在使用这项技术。

    依照惯例,贴源码,这么看着清晰些:

      1 package nov;
      2 
      3 import java.lang.reflect.Field;
      4 import java.lang.reflect.Method;
      5 /**
      6  * 
      7  * 
      8  * <p>
      9  * Title: 反射机制测试代码 /p>
     10  * 
     11  * <p>
     12  * Description: 示例 业务类
     13  * </p>
     14  * 
     15  * <p>
     16  * Copyright: Copyright (c) 2012
     17  * </p>
     18  * 
     19  * 
     20  * @author dml@2012-11-29
     21  * @version 1.0
     22  */
     23 public class ReflectTester {
     24     public Object copy(Object object) throws Exception {
     25         // 获得对象的类型
     26         Class<?> classType = object.getClass();
     27         System.out.println("Class:" + classType.getName());
     28 
     29         // 通过默认构造方法创建一个新的对象
     30         Object objectCopy = classType.getConstructor(new Class[] {})
     31                 .newInstance(new Object[] {});
     32 
     33         // 获得对象的所有属性
     34         Field fields[] = classType.getDeclaredFields();
     35 
     36         for (int i = 0; i < fields.length; i++) {
     37             Field field = fields[i];
     38             // 属性名称
     39             String fieldName = field.getName();
     40             // 得到属性名称的第一个字母并转成大写
     41             String firstLetter = fieldName.substring(0, 1).toUpperCase();
     42             // 获得和属性对应的getXXX()方法的名字:get+属性名称的第一个字母并转成大写+属性名去掉第一个字母,
     43             // 如属性名称为name,则:get+N+ame
     44             String getMethodName = "get" + firstLetter + fieldName.substring(1);
     45             // 获得和属性对应的setXXX()方法的名字
     46             String setMethodName = "set" + firstLetter + fieldName.substring(1);
     47 
     48             // 获得和属性对应的getXXX()方法
     49             Method getMethod = classType.getMethod(getMethodName,
     50                     new Class[] {});
     51             // 获得和属性对应的setXXX()方法,传入参数为参数的类型
     52             Method setMethod = classType.getMethod(setMethodName,
     53                     new Class[] { field.getType() });
     54 
     55             // 调用原对象的getXXX()方法
     56             Object value = getMethod.invoke(object, new Object[] {});
     57             System.out.println(fieldName + ":" + value);
     58             // 调用拷贝对象的setXXX()方法
     59             setMethod.invoke(objectCopy, new Object[] { value });
     60         }
     61         return objectCopy;
     62     }
     63 
     64     public static void main(String[] args) throws Exception {
     65         Customer customer = new Customer("Tom", 21);
     66         customer.setId(new Long(1));
     67         //运行时生成对象实例:类存在不带参数的构造函数 直接使用newInstance()方法
     68         Customer customerCopy = (Customer) new ReflectTester().copy(customer);
     69         System.out.println("Copy information:" + customerCopy.getId() + " "
     70                 + customerCopy.getName() + " " + customerCopy.getAge());
     71     }
     72 }
     73 
     74 public class Customer {
     75     private Long id;
     76 
     77     private String name;
     78 
     79     private int age;
     80 
     81     public Customer() {
     82     }
     83 
     84     public Customer(String name, int age) {
     85         this.name = name;
     86         this.age = age;
     87     }
     88 
     89     public Long getId() {
     90         return id;
     91     }
     92 
     93     public void setId(Long id) {
     94         this.id = id;
     95     }
     96 
     97     public String getName() {
     98         return name;
     99     }
    100 
    101     public void setName(String name) {
    102         this.name = name;
    103     }
    104 
    105     public int getAge() {
    106         return age;
    107     }
    108 
    109     public void setAge(int age) {
    110         this.age = age;
    111     }
    112 }

    注:以上代码摘自:【视频笔记】Java反射机制笔记

    输入结果:

    1 Class:nov.Customer
    2 id:1

    细细看看这段代码,然后再看理论,最后自己再理理,最后自己再写一段程序,以后做项目的时候,就又多了一个好的工具了。

    转自 :http://www.cnblogs.com/northeastTycoon/archive/2012/12/03/2799847.html

  • 相关阅读:
    利用wget下载文件,并保存到指定目录
    tar命令详解
    Ubuntu 16.04中安装Chromium浏览器
    怎么打开unity tweak tool
    WPS for linux不能使用中文输入法
    Window7 驱动编程环境配置
    Windows内核 字符串基本操作
    Windows内核 语言选择注意点
    Windows内核 内存管理基本概念
    Windows内核 WDM驱动程序的基本结构和实例
  • 原文地址:https://www.cnblogs.com/XiaoGer/p/2826887.html
Copyright © 2020-2023  润新知