zoukankan      html  css  js  c++  java
  • 源码详解Java的反射机制

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

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


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


    提供如下功能:

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

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


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

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

    package nov;

    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    /**
     *
     *
     * <p>
     * Title: 反射机制测试代码 /p>
     *
     * <p>
     * Description: 示例 业务类
     * </p>
     *
     * <p>
     * Copyright: Copyright (c) 2012
     * </p>
     *
     *
     * @author dml@2012-11-29
     * @version 1.0
     */
    public class ReflectTester {
        public Object copy(Object object) throws Exception {
            // 获得对象的类型
            Class<?> classType = object.getClass();
            System.out.println("Class:" + classType.getName());

            // 通过默认构造方法创建一个新的对象
            Object objectCopy = classType.getConstructor(new Class[] {})
                    .newInstance(new Object[] {});

            // 获得对象的所有属性
            Field fields[] = classType.getDeclaredFields();

            for (int i = 0; i < fields.length; i++) {
                Field field = fields[i];
                // 属性名称
                String fieldName = field.getName();
                // 得到属性名称的第一个字母并转成大写
                String firstLetter = fieldName.substring(0, 1).toUpperCase();
                // 获得和属性对应的getXXX()方法的名字:get+属性名称的第一个字母并转成大写+属性名去掉第一个字母,
                // 如属性名称为name,则:get+N+ame
                String getMethodName = "get" + firstLetter + fieldName.substring(1);
                // 获得和属性对应的setXXX()方法的名字
                String setMethodName = "set" + firstLetter + fieldName.substring(1);

                // 获得和属性对应的getXXX()方法
                Method getMethod = classType.getMethod(getMethodName,
                        new Class[] {});
                // 获得和属性对应的setXXX()方法,传入参数为参数的类型
                Method setMethod = classType.getMethod(setMethodName,
                        new Class[] { field.getType() });

                // 调用原对象的getXXX()方法
                Object value = getMethod.invoke(object, new Object[] {});
                System.out.println(fieldName + ":" + value);
                // 调用拷贝对象的setXXX()方法
                setMethod.invoke(objectCopy, new Object[] { value });
            }
            return objectCopy;
        }

        public static void main(String[] args) throws Exception {
            Customer customer = new Customer("Tom", 21);
            customer.setId(new Long(1));
            //运行时生成对象实例:类存在不带参数的构造函数 直接使用newInstance()方法
            Customer customerCopy = (Customer) new ReflectTester().copy(customer);
            System.out.println("Copy information:" + customerCopy.getId() + " "
                    + customerCopy.getName() + " " + customerCopy.getAge());
        }
    }

    public 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;
        }
    }

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

    输入结果:

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

  • 相关阅读:
    go函数
    Linux 查看磁盘容量、查找大文件、查找大目录
    五分钟理解一致性哈希算法(consistent hashing)
    使用Java实现三个线程交替打印0-74
    Python实现IOC控制反转
    Wannafly挑战赛5 A珂朵莉与宇宙 前缀和+枚举平方数
    Yandex Big Data Essentials Week1 Scaling Distributed File System
    Yandex Big Data Essentials Week1 Unix Command Line Interface Processes managing
    Yandex Big Data Essentials Week1 Unix Command Line Interface File Content exploration
    Yandex Big Data Essentials Week1 Unix Command Line Interface File System exploration
  • 原文地址:https://www.cnblogs.com/northeastTycoon/p/2799847.html
Copyright © 2011-2022 走看看