已知一个类的全命名,且该类在类的类路径下,可以通过Class类的静态方法forName()获取,可能抛出ClassNotFoundException
//1.Class.forName
String classAllPath="com.yhf.Car";//通过读取配置文件获取
Class<?> cls1 = Class.forName(classAllPath);
System.out.println(cls1);
已知具体的类,通过类的class属性获取
//2.类名.class--参数传递
Class cls2=Car.class;
System.out.println(cls2);
已知某个类的实列,调用实例的getClass()方法获取
//3 对象.getclass(),有对象实例
Car car = new Car();
Class cls3 = car.getClass();
System.out.println(cls3);
类加载器就是把类(class)加载进内存中
//4.通过类加载器[4种]来获取类的Class对象
//(1)先得到类加载器car
ClassLoader classLoader = car.getClass().getClassLoader();
//(2)通过类加载器得到Class对象
Class cls4 = classLoader.loadClass(classAllPath);
System.out.println(cls4);
//5.基本数据(int, char,boolean,float,double,byte,long,short) 按如下方式得到 Class 类对象
Class<Integer> integerClass = int.class;
Class<Character> characterClass = char.class;
Class<Boolean> booleanClass = boolean.class;
System.out.println(integerClass);//int
//6.基本数据类型对应的包装类,可以通过 .TYPE 得到 Class 类对象
Class<Integer> type1 = Integer.TYPE;
Class<Character> type2 = Character.TYPE;
Class常用方法
public static void main(String[] args) {
String classPath="com,yhf.Car";
Class<?> cls = Class.forName(classPath);
//显示cls对象
System.out.println(cls);
//输出cls运行类型
System.out.println(cls.getClass());
//得到包名
System.out.println(cls.getPackage().getName());
//得到全类名
System.out.println(cls.getName());
//通过cls创建对象实例
Car car = cls.getDeclaredConstructor().newInstance();
System.out.println(car);//car.toString
//通过反射获取属性
Field brand = cls.getField("brand");
System.out.println(brand.get(car));
}
那些类有Class对象
类加载
静态加载
编译时记载相关的类,如果没有就报错,依赖性强
动态加载
运行时加载需要的类,如果运行时不用该类,则不报错,降低了依赖性
new Dog()是静态加载,因此必须编写Dog
Person类是动态加载,因此没有编写Person类也不会报错,只有动态加载该类时,才会报错