1. 类对象,就是用于描述这种类,都有什么属性,什么方法的
2. 获取类对象
import charactor.Hero;
String className = "charactor.Hero";
//Class.forName(全限定类名)
Class pClass1=Class.forName(className);
//类名.class
Class pClass2=Hero.class;
//new 类名().getClass();
Class pClass3=new Hero().getClass();
tip:通常一个JVM下,只会有一个ClassLoader,一种类,只会有一个类对象存在。所以以上三种方式取出来的类对象,都是一样的
无论什么途径获取类对象,都会导致静态属性被初始化,而且只会执行一次。
3.反射
反射机制:反射一个类拥有的方法和属性
1.反射对象:会先拿到某个类的“类对象”,然后newInstance()
Role h2= (Role) Class.forName(“com.cwz.Role”).newInstance();
2.反射属性:会先拿到某个类的“类对象”,然后getDeclaredField()
Hero h =new Hero();
Field f1= h.getClass().getDeclaredField(“name”);
tip:getField和getDeclaredField的区别
- getField 只能获取public的,包括从父类继承来的字段。
- getDeclaredField可以获取本类所有的字段,包括private的,但是不能获取继承来的字段。 (注:这里只能获取到private的字段,但并不能访问该private字段的值,除非加上setAccessible(true))
- 反射方法:会先拿到某个类的“类对象”,然后getMethod(“方法名”, 方法类型.class)
Hero h = new Hero();
Method m = h.getClass().getMethod(“setName”, String.class);
// 对h对象,调用这个方法
m.invoke(h, “盖伦”);