Java中的几个元老 Object Class 和 @Retention
Java是面向对象型语言所有的类型的父类是Object ,而表示类型的元对象又是Class, Java支持注解后所有注解的元注解是@Retention
一、Object
在Java中,所有的类,包括数组,都是Object类的子类。这是因为Java不支持多重继承,但可以实现多个接口。因此,为了保证所有的类都能被Object类的方法操作,所有的类都被视作Object的子类。
在Java中,所有的类都直接或间接地继承了java.lang.Object
类,因为它是所有对象的基类。这意味着Object
是Java对象层次结构的根类,所有对象(包括数组)都直接或间接地继承了Object
类的方法。
以下是Object
类的一些常用方法:
-
equals(Object obj)
: 判断指定的对象是否等于此对象。 -
hashCode()
: 返回该对象的哈希码值。 -
toString()
: 返回该对象的字符串表示。 -
getClass()
: 返回此Object
的运行时类。 -
wait()
: 使当前线程等待,直到其他线程调用此对象的notify()
方法或notifyAll()
方法。 -
notify()
: 唤醒在此对象监视器上等待的单个线程。 -
notifyAll()
: 唤醒在此对象监视器上等待的所有线程。
由于所有的类都默认继承了Object
类,因此你不需要显式地声明继承Object
类。
二、Class
Class
是 Java 中的一个关键字,它是 Java 反射机制的核心,用来表示类的类型。通过 Class
对象,我们可以获取类的相关信息,比如类名、属性、方法等。
以下是一些使用 Class
关键字的常见方法:
-
通过
.class
语法获取Class
对象:
Class<MyClass> clazz = MyClass.class;
-
使用
Class.forName()
方法动态加载类并获取Class
对象:
try {
Class<?> clazz = Class.forName("com.example.MyClass");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
-
使用
Class
对象创建实例(需要无参构造函数):
Class<MyClass> clazz = MyClass.class;
MyClass obj = clazz.newInstance();
-
使用
Class
对象获取方法和构造函数信息:
Class<MyClass> clazz = MyClass.class;
Method[] methods = clazz.getMethods();
Constructor<?>[] constructors = clazz.getConstructors();
三、@Retention
1、介绍:
@Retention是用来修饰注解的,注解的注解,也称为元注解
2、作用:
@Retention修饰注解,用来表示注解的生命周期,生命周期的长短取决于@Retention的属性RetentionPolicy指定的值,例如@Retention(RetentionPolicy.RUNTIME)
RetentionPolicy.SOURCE
表示注解只保留在源文件,当java文件编译成class文件,就会消失
源文件
只是做一些检查性的操作,,比如 @Override 和 @SuppressWarnings
RetentionPolicy.CLASS
注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期
class文件(默认)
要在编译时进行一些预处理操作,比如生成一些辅助代码(如 ButterKnife)
RetentionPolicy.RUNTIME
注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在
运行时也存在
需要在运行时去动态获取注解信息
上面三种类型生命周期:SOURCE<CLASS<RUNTIME,使用RUNTIME会包含前面两个生命周期