1. Class对象和实例对象
实例对象是类的实例,基于某个类 new 出来的对象
Class对象是JVM生成用来保存对象的类的信息
1.1 Class对象
- 每个类加载到内存后都对应一个 Class 对象
- 每个类有且只有一个 Class 对象
Class 对象是类加载的产物,封装了一个类的所有信息(类名、父类、接口、属性、方法、构造方法);程序运行中,可通过 Class 对象获取类的信息
显示类的加载过程:-verbose:class
2. 获取 Class 对象
public void test() {
// 方式一:对象.getClass()
Demo demo = new Demo();
Class<?> clazz = demo.getClass();
// 方式二:类名.class
Class<?> clazz = Demo.class;
// 方式三:Class 的静态方法
Class<?> clazz = Class.forName("com.example.Demo");
System.out.println(clazz.hashCode());
}
3. java.lang.Class
public interface Type {
default String getTypeName() {
return toString();
}
}
public final class Class<T> implements java.io.Serializable,
GenericDeclaration, Type, AnnotatedElement {
public String getName() {}
public Package getPackage() {}
public native Class<? super T> getSuperclass();
public Class<?>[] getInterfaces() {}
public Constructor<?>[] getConstructors() {}
public T newInstance() {}
public Method[] getMethods() {}
public Method[] getDeclaredMethods() {}
public Field[] getFields() {}
public Field[] getDeclaredFields() {}
}
3.1 基础用法
public void test() {
// 类类型数值:class, interface...
int modifiers = clazz.getModifiers();
// boolean isInterface(int mod) { return (mod & INTERFACE) != 0;}
String packageName = clazz.getPackage().getName();
String fullName = clazz.getName();
String simpleName = clazz.getSimpleName();
}
获取 ClassLoader
ClassLoader classLoader = clazz.getClassLoader();
ClassLoader classLoader = this.getClass().getClassLoader();
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Class<?> clazz = classLoader.loadClass("com.example.pojo.Son");
获取相关类
public class Student extends Person implements Serializable {}
Class<?> clazz = Student.class;
// 获取实现的接口,一般在动态代理时使用
Class<?>[] interfaces = clazz.getInterfaces();
System.out.println(Arrays.toString(interfaces));
// 获取父类
Class<?> superclass = clazz.getSuperclass();
String superclassName = superclass.getName();
3.2 获取构造方法
Class<?> clazz = Student.class;
Constructor<?>[] constructors = clazz.getConstructors();
System.out.println(Arrays.toString(constructors));
3.3 获取泛型父类
getGenericSuperclass() 获取继承的泛型父类
getGenericInterfaces() 获取实现的接口父类
因为是单继承,多实现,所以 getGenericInterfaces() 返回的是Type数组
Type genericSuperclass = Demo.class.getGenericSuperclass();
Type[] genericInterfaces = Demo.class.getGenericInterfaces();
网友评论