最通俗易懂,简洁的解释清楚到底什么是反射

1.每一个普通类都对应着一个Class类(一个特殊类)的实例对象

有的类叫Person,有的类叫Student,而有一个特殊的类叫作Class

public class Class
{

}

JVM会为每一个类创建一个Class类的实例对象,比如为String类创建一个Class类的实例对象:

Class test=new Class("String");

在JVM中创建了很多个这样的Class类实例对象,一个实例对象对应一个类:

每一个实例对象中保存着关于它对应类的完整信息,比如下面这个实例对象就保存着String类的全部完整信息:这个类的名字,属于哪个包,父类是哪个类,这个类里面有哪些属性,这个类里面有哪些方法

如果获取了某个Class类的实例对象,就可以知道这个实例对象所对应的类的全部信息

这种通过Class类的实例对象来获取该实例对象所对应的类的所有信息,就叫做反射

2.假设我现在有一个类A(A可能是String,Person,Student.....),如何获得这个类A对应的Class类的实例对象

(1)通过类A本身的一个叫作class的属性:

Class test=A.class();


比如说当A是String类,那么就是:
Class test=String.class();

(2)通过类A的实例对象的getClass()方法:

A a=new A( );
Class test=a.getClass();

当A是String类的时候:
String a=new String("Hello,world");
Class test=a.getClass();

(3)通过类A的完整类名(哪个包下的哪个类,也就是全限定类名)

比如说当A是String的时候:
Class cls = Class.forName("java.lang.String");

 由于每个类对应的Class类的实例对象都是唯一的,所以上面三种方法得到的实例对象都是同一个实例对象:

Class test1 = String.class;

String s = "Hello";
Class test2 = s.getClass();

System.out.println(cls1 == cls2); // true

3.拿到这个Class类的实例对象之后,如何通过这个实例对象来创建类A的实例对象

(1)通过Class类的实例对象的newInstance方法

//拿到String类对应的Class类的实例对象
Class test=String.class();

//创建一个String类的对象
Object obj=test.newInstance();

这种创建方法只适合创建这个对象时不需要传入任何参数,等价于:

Student stu=new Student();

 如果创建对象需要传入参数,比如想达到下面的等价结果:

Student stu=new Student("张三",20,96.8);

那就需要使用下面的创建方式:

(2)

//拿到Student类对应的Class类的实例对象
Class test=Student.class();

//表明创建这个Student类对象时需要传入三个值
//第一个值是一个字符串,第二个值是一个int型的数,第三个是double型的数
Constructor constructor=test.getDeclaredConstructor(String.class,int.class,double.class);

Object obj=constructor.newInstance("张三",20,98.9);

猜你喜欢

转载自blog.csdn.net/weixin_47414034/article/details/125379828
今日推荐