Class类
1.类图
2.Class类对象 系统创建
该class对象是通过类加载器ClassLoader的loadClass()方法生成对应类对应的class对象
通过debug可以追到该方法
3.对于某个类的class类对象
只加载一次
因为类值加载一次
类加载的时机
//1.创建对象实例的时候(new)
//2.创建子类对象实例的时候,父类也会被加载
//3.使用该类的静态成员变量时,该类也会加载
演示一下
运行结果
4.
大概就是我们创建的对象(比如cat)
这个cat对象和我们堆中Cat类对于的Class对象
有联系,cat和对应的Cat类的Class对象有联系
简而言之,每个对象从属于所属类的Class对象
其实我们的getClass返回的就是这个Class对象
5.通过对应方法来获得对应的属性/方法,具体在下面常用方法
6.没什么好说的
7.
常用方法
package yuan.hsp.reflection.Class;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import yuan.hsp.reflection.Cat;
@SuppressWarnings({"all"})
//class类的基本介绍
public class introduce {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, NoSuchFieldException {
String classPath="yuan.hsp.reflection.Class.Car";
//1.获取到Car类对应的Class对象
Class cls = Class.forName(classPath);
//2.输出cls
System.out.println(cls);//会显示是哪个类的Class对像(应该是toString重写的)
System.out.println(cls.getClass());//输出cls的运行类型 java.lang.Class
//3.得到包名
System.out.println("================================");
System.out.println(cls.getPackage().getName());
System.out.println(cls.getPackageName());//两种都可以
//4.得到全类名
System.out.println("================================");
System.out.println(cls.getName());//返回类名
//5.通过cls创建对象实例
Object newInstance = cls.newInstance();//当然这个现在弃用了
Car newInstance2 = (Car)cls.getDeclaredConstructor().newInstance();//现在一般用这个方法
//先获构造器再创建对象实例
System.out.println(newInstance2);
//6.通过反射获取属性brand,注意:私有属性不能通过该方式获取,后面有单独讲
Field brand = cls.getField("brand");
System.out.println(brand.get(newInstance2));
//7.通过反射给属性赋值
brand.set(newInstance2, "奔驰");
System.out.println(brand.get(newInstance2));
//8.希望可以得到Car里所有的属性
System.out.println("======================================");
Field[] fields = cls.getFields();
for (Field field : fields) {
System.out.println(field.getName());//依次输出属性的名称
}
}
}
class Car{
public String brand="宝马";
public int price=1000000;
public String color="白";
@Override
public String toString() {
return "Car [brand=" + brand + ", price=" + price + ", color=" + color + "]";
}
}
运行结果
class yuan.hsp.reflection.Class.Car
class java.lang.Class
================================
yuan.hsp.reflection.Class
yuan.hsp.reflection.Class
================================
yuan.hsp.reflection.Class.Car
Car [brand=宝马, price=1000000, color=白]
宝马
奔驰
======================================
brand
price
color
获取Class类对象的六种方式
主要方法是前四种
还有两种特别的
package yuan.hsp.reflection;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
//本篇主要是获取Class类的各种方法
@SuppressWarnings({"all"})
public class GetClass {
public static void main(String[] args) throws ClassNotFoundException, FileNotFoundException, IOException {
//1.Class.forName(对应类的全路径)-常用于配置文件读取类全路径,加载类
Properties properties = new Properties();
properties.load(new FileInputStream("src\\re.properties"));
String classfullpath = properties.get("classfullpath").toString();
Class cls1 = Class.forName(classfullpath);
System.out.println(cls1);
//2.若已知具体的类,通过类的class获取,该方式最安全可靠程序性能最高-多用于参数传递
Class cls2 = Cat.class;
System.out.println(cls2);
//3.已知某个类的实例,调用该对应的getClass()方法,获取对象所属类对应的Class对象-应用场景:通过建好的对象,获取Class对象(运行类型)
Cat cat = new Cat();
Class cls3 = cat.getClass();
System.out.println(cls3);
//4.通过类加载器获取类的Class对象
//(1)先得到类加载器cat
ClassLoader classLoader = cat.getClass().getClassLoader();
//(2)通过类加载器得到Class对象
Class cls4 = classLoader.loadClass(classfullpath);
System.out.println(cls4);
//cls1,cls2,cls3,cls4都是同一个Class对象
//基本数据类型获取class的两种方式
//1.(基本数据类型int,short,long).class得到Class对象
Class<Integer> i = int.class;
Class<Character> c = char.class;
System.out.println(i);
System.out.println(c);
//2.基本数据类型对应的包装类.type,获得对应的Class对象
Class<Integer> type = Integer.TYPE;
System.out.println(type);
//然后其实这个int和Integer其实是对应的一个Class,int自动装箱为Integer获取对应的Class对象
System.out.println(i.hashCode());
System.out.println(type.hashCode());
}
}
其实前四种方式是不同阶段的获取
1.代码阶段2.加载阶段3.RunTime阶段(创建完对象后)4类加载过程阶段
哪些类有Class对象