1. Class也是类,因此也继承Object类
2. Class类对象不是new出来的,而是系统创建的
3. 对于某个类的Class类对象,在内存中只有一份,因为类只加载一次
4.每个类的实例都会记得自己是由哪个 Class 实例所生成
5. 通过Class对象可以完整地得到一个类的完整结构,通过一系列API
6. Class对象是存放在堆的
7. 类的字节码二进制数据,是放在方法区的,有的地方称为类的元数据(包括 方法代码,
变量,访问权限等等)
package Reflection;
/**
* @author whlie(true){learn}
*/
public class Car {
public String brand="宝马";
public int price=1000000;
public String color="黑色";
@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", price=" + price +
", color='" + color + '\'' +
'}';
}
}
package Reflection;
import java.lang.reflect.Field;
/**
* @author whlie(true){learn}
*/
public class Usual {
public static void main(String[] args) throws Exception {
String classAllPath="Reflection.Car";
//1.获取Car对应的Class对象,<?>代表不确定的Java类型
Class<?> cls = Class.forName(classAllPath);
//2.输出cls
//显示cls对象是那个类的class对象
System.out.println(cls);
//输出cls的运行类型
System.out.println(cls.getClass());
//3.得到包名
System.out.println(cls.getPackage().getName());
//4.得到全类名
System.out.println(cls.getName());
//5.通过cls创建对象实例
Car car=(Car)cls.newInstance();
System.out.println(car);
//6.通过反射获取属性
Field brand = cls.getField("brand");
System.out.println(brand.get(car));
//7.通过反射给属性赋值
brand.set(car,"奔驰");
System.out.println(brand.get(car));
//8.获取所有的属性
Field[] fields = cls.getFields();
for (Field f:fields){
System.out.println(f.getName());
}
}
}
获取Class类的方法
package Reflection;
/**
* @author whlie(true){learn}
*/
public class Getclass {
public static void main(String[] args) throws Exception {
//1.Class.forName通过读取配置文件获取
//前提:已知一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取
//多用于配置文件,读取类全路径,加载类
String classAllpath="Reflection.Car";
Class<?> cls1 = Class.forName(classAllpath);
System.out.println(cls1);
//2.类名.class
//前提:若已知具体的类,通过类的class 获取,该式最为安全可靠,性能最高
//多用于参数传递,比如通过反射得到对应构造器对象.
Class cls2=Car.class;
System.out.println(cls2);
//3.对象.getclass()
//前提:已知某个类的实例,调用该实例的getclass方法获取Class对象
//多用于创建好的对象获取Class对象
Car car = new Car();
Class cls3 = car.getClass();
System.out.println(cls3);
//4.通过类加载器来获取到类的Class对象
//(1)先得到类加载器Car
ClassLoader classLoader = car.getClass().getClassLoader();
//(2)通过类加载器得到Class对象
Class cls4 = classLoader.loadClass(classAllpath);
System.out.println(cls4);
}
}
静态加载:程序编译时就会加载,依赖性强
例如:创建对象(new)时,子类被加载时,调用类中的静态成员时
动态加载:当程序运行到的时候才会加载,降低了依赖性
例如:反射