Class类以及相关方法和获取的方式

Class类

  1. Class也是类,因此继承Object类
  2. Class类对象不是new出来的,而是系统创建的
  3. 对于某个类的Class类对象,在内存中只有一份,因此类只加载一次
  4. 每一个类的实例都会记得自己由那个Class实例化生成
  5. 通过Class可以得到一个类的完整结构
  6. Class对象是放在堆中的
  7. 注意在方法区中,会存在cat类的二进制字节码数据

传统对象debug与我们反射对象的debug可以发现都是通过ClassLoader类的loadClass加载到堆中,而且我们cat.class对象只会存在份,不管我们new多少次,还是会存在一次,类不同才会不同

class拥有许多的方法,可以得到对象的很多的信息。

Class类的常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.zss.reflact;


/**
* @author zss
*/
public class Cat {
public String name="asac";
public int age=0;
public String sex="娜娜";

@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.zss.reflact;

import java.io.IOException;
import java.lang.reflect.Field;

/**
* @author zss
*/

public class Test {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException {
String classPath="com.zss.reflact.Cat";
//?代表不确定的类型
Class<?> cla=Class.forName(classPath);
//尝试输出cla,这里显示那个类的Class对象
System.out.println(cla);
//得到其运行类型
System.out.println(cla.getClass());
//得到包名
System.out.println(cla.getPackage().getName());
//得到全类名
System.out.println(cla.getName());
//创建对象实例
Cat cat=(Cat) cla.newInstance();
System.out.println(cat);
//通过反射获取属性
Field name=cla.getField("name");
System.out.println(name.get(cat));
//通过反射设置值
name.set(cat,"sec");
System.out.println(cat);
//得到所有的字段属性
Field[] fields=cla.getFields();
//System.out.println(fields);
for (Field f:fields){
System.out.println(f.getName());
}
}
}

image-20220321172447804