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中反射书写的步骤的主要内容,如果未能解决你的问题,请参考以下文章