Class类
- Class也是类,因此继承Object类
- Class类对象不是new出来的,而是系统创建的
- 对于某个类的Class类对象,在内存中只有一份,因此类只加载一次
- 每一个类的实例都会记得自己由那个Class实例化生成
- 通过Class可以得到一个类的完整结构
- Class对象是放在堆中的
- 注意在方法区中,会存在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;
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;
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); 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(); for (Field f:fields){ System.out.println(f.getName()); } } }
|