您当前的位置: 首页 >  Java

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

java中反射书写的步骤

小志的博客 发布时间:2021-10-24 23:10:59 ,浏览量:0

目录
    • 一、反射创建对象的过程
    • 二、反射通过Class创建对象的示例
    • 三、反射通过私有构造方法创建对象示例

一、反射创建对象的过程

1、创建对象的过程图解

在这里插入图片描述

2、通过上图可知,获得对象实例无论是使用new对象的方式,还是使用反射,需要3个步骤:

  • 加载Class文件
  • 查找、创建构造函数
  • 通过构造函数,创建实例对象
二、反射通过Class创建对象的示例

1、代码

package com.xz.springboottest.day1;
/**
 * @description:
 * @author: xz
 */
public class Person {
    private String name;
    private int age;
		//无参构造方法
    public Person() {

    }
   //带参构造方法
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //省略setter、getter、tostring方法
}
package com.xz.springboottest.day1;
import java.lang.reflect.Constructor;
/**
 * @description:
 * @author: xz
 */
public class SingletonTest {
    public static void main(String[] args) throws Throwable {
        /**1、获取Person的字节码*/
        Class personClass = Class.forName("com.xz.springboottest.day1.Person");

        /**2、通过Class对象,创建构造方法对象*/
        Constructor constructor1 = personClass.getConstructor();//初始化无参构造方法
        Constructor constructor2 = personClass.getConstructor(String.class, int.class);//初始化有参构造方法对象

        /**3、通过构造方法创建对象*/
        //调用无参构造方法创建Person对象
        Person person1 = (Person) constructor1.newInstance();
        person1.setName("xz");
        person1.setAge(28);
        System.out.println("person1==="+person1);

        //调用有参构造方法创建Person对象
        Person person2 = (Person) constructor2.newInstance("张三", 30);
        System.out.println("person2==="+person2);


    }
}

2、输出结果如下所示:

在这里插入图片描述

三、反射通过私有构造方法创建对象示例

1、代码

package com.xz.springboottest.day1;
/**
 * @description:
 * @author: xz
 */
public class Person {
    private String name;
    private int age;
		//无参构造方法
    public Person() {

    }
   //带参构造方法
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //省略setter、getter、tostring方法
}
package com.xz.springboottest.day1;
/**
 * @description: 单例类
 * @author: xz
 */
public class SingletonPerson {

    private static final SingletonPerson singletonPerson=new SingletonPerson();

    private SingletonPerson(){

    }
    public static SingletonPerson getInstance(){
        return singletonPerson;
    }
}
package com.xz.springboottest.day1;
import java.lang.reflect.Constructor;
/**
 * @description:
 * @author: xz
 */
public class SingletonTest2 {
    public static void main(String[] args) throws Throwable{
        /**反射通过私有构造方法创建对象,破坏单例模式*/

        //获取Person的字节码
        Class singletonPersonClass = SingletonPerson.class;

        //通过Class对象,创建构造方法对象
        //getDeclaredConstructor()可获取到类的私有构造器,但是必须设置setAccessible()为true
        Constructor constructor3 = singletonPersonClass.getDeclaredConstructor();
        constructor3.setAccessible(true);
        //通过构造方法创建对象
        SingletonPerson singletonPerson = (SingletonPerson) constructor3.newInstance();
        System.out.println("singletonPerson----"+singletonPerson);
        //获取实例化对象
        SingletonPerson singletonPerson1 = singletonPerson.getInstance();
        SingletonPerson singletonPerson2 = singletonPerson.getInstance();
        System.out.println("singletonPerson1----"+singletonPerson1);
        System.out.println("singletonPerson2----"+singletonPerson2);

        System.out.println("singletonPerson==singletonPerson1==== "+ (singletonPerson==singletonPerson1));
        System.out.println("singletonPerson==singletonPerson2==== "+ (singletonPerson==singletonPerson2));
        System.out.println("singletonPerson1==singletonPerson2==== "+ (singletonPerson1==singletonPerson2));
    }
}

2、输出结果如下所示:

在这里插入图片描述

  • 解释:由上图示例输出结果可知,反射通过私有构造方法创建对象,会破坏单例模式。
关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.0489s