• java反射——构造方法


            大家都知道反射技术在Java里面时非常重要的一个技术点,因为Java好多框架的编写都是基于反射的,别的不多说,spring框架里面的IOC就是基于反射实现。那么什么是反射呢?JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。说白了,反射就是加载类,并且反射出类的各个组成部分的一种实现方式。

     那么我们如何去加载一个类呢?可以通过以下几种方式实现。

    public void testLoadClass() throws ClassNotFoundException {
    
            // 获取字节码类,可以采用一下三种方法
            // 相当于加载Person.class文件加入到内存中
            Class clazz = Class.forName("com.day09.Person");
            Class clazz1 = new Person().getClass();
            Class clazz2 = Person.class;
        }

            Java是一种面向对象的语言,而Java创建对象的一般都是通过new+构造方法来创建对象的,所以我们先来看看如何反射类的构造方法。同时,因为Java的方法重载机制,所以构造方法也存在多种性质,下面我们的例子将演示几种最常见的构造方法,并利用反射来用他们来创建对象。

    1.定义一个简单的Person类

    package com.day09;
    
    import java.util.List;
    
    public class Person {
        public Person() {
            System.out.println("Person");
        }
    
        public Person(String name) {
            System.out.println("person name");
        }
    
        public Person(String name, int password) {
            System.out.println("Person name password");
        }
    
        private Person(List list) {
            System.out.println("Person list");
    
        }
    
    }

    2.利用Junit来演示进行演示测试

    package com.day09;
    
    import java.util.List;
    import java.lang.reflect.Constructor;
    import java.util.ArrayList;
    
    import org.junit.Test;
    
    /**
     * 放射就是加载类,并解剖出类的各个组成部分 类的组成部分: 1.构造方法:创建对象 2.属性字段:封装数据 3.属性方法:封装功能
     * 
     * @author Administrator
     *
     */
    public class ReflectConstructDemo {
        @Test
        public void testLoadClass() throws ClassNotFoundException {
    
            // 获取字节码类,可以采用一下三种方法
            // 相当于加载Person.class文件加入到内存中
            Class clazz = Class.forName("com.day09.Person");
            Class clazz1 = new Person().getClass();
            Class clazz2 = Person.class;
        }
    
        /**
         * public Person() 反射无参构造方法
         * 
         * @throws Exception
         */
        @Test
        public void reflectConstructNoParameter() throws Exception {
            // 将person类加载到内存中
            Class<?> clazz = Class.forName("com.day09.Person");
            // 传入参数,获取对应的构造函数
            Constructor<?> personCon = clazz.getConstructor(null);
            // 传入参数开始创建对象
            Person p = (Person) personCon.newInstance(null);
        }
    
        /**
         * 反射带有一个参数构造方法构造方法 public Person(String name)
         * 
         * @throws Exception
         */
        @Test
        public void reflectConstructOneParameter() throws Exception {
            // 将person类加载到内存中
            Class<?> clazz = Class.forName("com.day09.Person");
            // 传入参数,获取对应的构造函数,这里面要传入一个参数类型,来获取对应参数的构造方法
            Constructor<?> personCon = clazz.getConstructor(String.class);
            // 传入参数开始创建对象
            Person p = (Person) personCon.newInstance("zhangsan");
        }
    
        /**
         * 反射带有多个参数构造方法构造方法 Person(String name, int password)
         * 
         * @throws Exception
         */
        @Test
        public void reflectConstructManyParameter() throws Exception {
            // 将person类加载到内存中
            Class<?> clazz = Class.forName("com.day09.Person");
            // 传入参数,获取对应的构造函数,这里面要传入一个参数类型,来获取对应参数的构造方法
            Constructor<?> personCon = clazz.getConstructor(String.class, int.class);
            // 传入参数开始创建对象
            Person p = (Person) personCon.newInstance("zhangsan", 23);
        }
    
        /**
         * 反射私有的构造方法构造方法 private Person(List list)
         * 
         * @throws Exception
         */
        @Test
        public void reflectPrivateConstruct() throws Exception {
            // 将person类加载到内存中
            Class<?> clazz = Class.forName("com.day09.Person");
            // 传入参数,获取对应的构造函数,这里面要传入一个参数类型,来获取对应参数的构造方法
            // 这里因为该构造方法是私有的,所以用用getDeclaredConstructor才能获得构造方法对象
            Constructor<?> personCon = clazz.getDeclaredConstructor(List.class);
            // 要使用私有的属性成员,还需要放开权限,设为可见
            personCon.setAccessible(true);
            // 传入参数开始创建对象
            Person p = (Person) personCon.newInstance(new ArrayList());
        }
    
        /**
         * 通过class类,可以直接通过无参的构造方法创建对象
         * 
         * @throws Exception
         */
    
        @Test
        public void testNewObj() throws Exception {
            // 将person类加载到内存中
            Class<?> clazz = Class.forName("com.day09.Person");
            Person p = (Person) clazz.newInstance();
        }
    }

    至此,我们已将常见的几种通过反射获得构造方法,并创建对象演示完毕,有不足的地方,希望大家多多提意见!

  • 相关阅读:
    我是如何折腾.NET Resx资源文件的 当计算机中的资源已经足够多时,我们也要学会尽可能的借用
    当程序开发人员开始抛弃技术时,是否意味着噩梦的开始?抛弃了SQL Server 2000才发现客户的简单问题真的很难解决
    分享.NET ERP项目开发中应用到的重量级工具 选择合适的工具和资源,做项目效率高而且规范程度高
    Management Console ERP项目开发辅助工具 正确的方法+适当的工具使做项目的效率高而且问题少
    ERP系统管理员的工具箱 推荐几款优秀的数据比较同步工具 Data Compare and Sync tool
    亲自下载CSDN社区600万用户数据 设计两条编程题目考验你的.NET编程基础
    知识管理系统Data Solution研发日记之十六 保存服务器文档为本机PDF格式
    【转】好的学习方法
    iPhone开发学习笔记[7/50]在xcode里配置成功subversion
    iPhone开发学习笔记[4/50]表视图的使用
  • 原文地址:https://www.cnblogs.com/nanyangke-cjz/p/7105665.html
Copyright © 2020-2023  润新知