Java中注解对象是否继承Object类?为何缺失clone()与finalize()方法?
注解对象与Object类的继承关系及方法调用问题
注解对象确实继承Object类
Java里所有对象都直接或间接继承自Object,注解对象也不例外。当你通过反射获取注解实例时,JVM会动态生成一个实现了该注解接口的代理类,这个代理类的实例就是你拿到的注解对象,而这个代理类的父类就是Object。
为什么调用clone()和finalize()会报错?
问题出在编译时的静态类型检查:
- 变量
frank的静态类型是about(这是一个注解接口),而注解接口本身继承的是java.lang.annotation.Annotation,并没有声明clone()和finalize()方法。 - 编译器只会根据变量的静态类型检查方法是否存在,虽然注解对象的实际运行时类继承了Object,但编译阶段看不到这些方法,所以直接报错。
如果非要调用Object的这些方法,可以把注解对象强转为Object类型:
((Object) frank).clone(); // 编译通过,但会抛出CloneNotSupportedException(注解代理类通常不支持克隆) ((Object) frank).finalize(); // 编译通过,但finalize已被废弃,不建议使用
另外补充:注解实例是JVM缓存的不可变对象,clone()对它没有实际意义,所以JVM生成的代理类也不会重写这个方法,就算强转调用也会抛出异常。
内容的提问来源于stack exchange,提问作者Richie
相关产品推荐
相关产品推荐

