主要介绍以下几方面内容
理解 Class 类
理解反射的机制
1.理解Class类
–对象照镜子后可以得到的信息:某个类的数据成员名、方法和构造器、某个类到底实现了哪些接口。对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。
–Class 对象只能由系统建立对象
–一个类在 JVM 中只会有一个Class实例
–每个类的实例都会记得自己是由哪个 Class 实例所生成
1: Class是什么?
Class是一个类:
public class ReflectionTest {
@Test
public void testClass() {
Class clazz = null;
}
}
//Class的定义
public final
class Class<T> implements java.io.Serializable,
java.lang.reflect.GenericDeclaration,
java.lang.reflect.Type,
java.lang.reflect.AnnotatedElement {
.....
.....
.....
}//小写class表示是一个类类型,大写Class表示这个类的名称
2:Class这个类封装了什么信息?
Class是一个类,封装了当前对象所对应的类的信息
一个类中有属性,方法,构造器等,比如说有一个Person类,一个Order类,一个Book类,这些都是不同的类,现在需要一个类,用来描述类,这就是Class,它应该有类名,属性,方法,构造器等。Class是用来描述类的类
Class类是一个对象照镜子的结果,对象可以看到自己有哪些属性,方法,构造器,实现了哪些接口等等
3.对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。
4.Class 对象只能由系统建立对象,一个类(而不是一个对象)在 JVM 中只会有一个Class实例
定义一个Person类
package com.atguigu.java.fanshe;
public class Person {
String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//包含一个带参的构造器和一个不带参的构造器
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
super();
}
}
通过Class类获取类对象
public class ReflectionTest {
@Test
public void testClass() {
Class clazz = null;
//1.得到Class对象
clazz = Person.class;
System.out.println(); //插入断点
}
}
在断点处就可以看到Class对像包含的信息
同样,这些属性值是可以获取的
public class ReflectionTest {
@Test
public void testClass() {
Class clazz = null;
//1.得到Class对象
clazz = Person.class;
//2.返回字段的数组
Field[] fields = clazz.getDeclaredFields();
System.out.println(); //插入断点
}
}
查看fields的内容
对象为什么需要照镜子呢?
1. 有可能这个对象是别人传过来的
2. 有可能没有对象,只有一个全类名
通过反射,可以得到这个类里面的信息
获取Class对象的三种方式
1.通过类名获取 类名.class
2.通过对象获取 对象名.getClass()
3.通过全类名获取 Class.forName(全类名)
public class ReflectionTest {
@Test
public void testClass() throws ClassNotFoundException {
Class clazz = null;
//1.通过类名
clazz = Person.class;
//2.通过对象名
//这种方式是用在传进来一个对象,却不知道对象类型的时候使用
Person person = new Person();
clazz = person.getClass();
//上面这个例子的意义不大,因为已经知道person类型是Person类,再这样写就没有必要了
//如果传进来是一个Object类,这种做法就是应该的
Object obj = new Person()