java中反射书写的步骤

Posted 小志的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中反射书写的步骤相关的知识,希望对你有一定的参考价值。

一、反射创建对象的过程

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、输出结果如下所示:

  • 解释:由上图示例输出结果可知,反射通过私有构造方法创建对象,会破坏单例模式。

以上是关于java中反射书写的步骤的主要内容,如果未能解决你的问题,请参考以下文章

反射机制

Xcode自定义代码块

java正则表达式怎么书写?

反射机制入门

反射机制入门

java笔记