美文网首页
Java的Class对象

Java的Class对象

作者: Tinyspot | 来源:发表于2022-07-21 11:09 被阅读0次

1. Class对象和实例对象

实例对象是类的实例,基于某个类 new 出来的对象
Class对象是JVM生成用来保存对象的类的信息

1.1 Class对象

  • 每个类加载到内存后都对应一个 Class 对象
  • 每个类有且只有一个 Class 对象

Class 对象是类加载的产物,封装了一个类的所有信息(类名、父类、接口、属性、方法、构造方法);程序运行中,可通过 Class 对象获取类的信息

显示类的加载过程:-verbose:class

vm-options.png

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();

相关文章

网友评论

      本文标题:Java的Class对象

      本文链接:https://www.haomeiwen.com/subject/ofduirtx.html