据我所知:Java中的每个类都继承了Object Class的方法,而不需要指定这样做,这使得这个类如此独特和有趣.
因此我想知道,在JVM中指定了这个"规则"在哪里?可以以某种方式操纵此类,例如添加或删除方法或变量吗?是否可以独立于Object类创建并行的分层结构?
Tam*_*dus 11
在Object类本身确实是特殊的.如果您rt.jar在jre文件夹中查看它的实现,您会注意到它的大部分方法都只是带有native修饰符的声明.
package java.lang;
public class Object
{
private static native void registerNatives();
public final native Class<?> getClass();
public native int hashCode();
public boolean equals(Object paramObject)
{
return this == paramObject;
}
protected native Object clone()
throws CloneNotSupportedException;
public String toString()
{
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
public final native void notify();
public final native void notifyAll();
public final native void wait(long paramLong)
throws InterruptedException;
public final void wait(long paramLong, int paramInt)
throws InterruptedException
{
if (paramLong < 0L) {
throw new IllegalArgumentException("timeout value is negative");
}
if ((paramInt < 0) || (paramInt > 999999)) {
throw new IllegalArgumentException("nanosecond timeout value out of range");
}
if (paramInt > 0) {
paramLong += 1L;
}
wait(paramLong);
}
public final void wait()
throws InterruptedException
{
wait(0L);
}
protected void finalize()
throws Throwable
{}
static {}
}
Run Code Online (Sandbox Code Playgroud)
这些本机方法是在JVM本身内部实现的.这些方法是Java程序的本机部分和托管部分之间的桥梁.因此,将这个Object类作为"每个对象中的常见事物" 是很自然的.Java语言的指定方式除此之外无法构建单独的类层次结构Object.
Object虽然我还没有尝试过,但是可以修改原始的Object类.确保现有方法无法删除,因为大多数运行时依赖于它们,但我发现有可能通过修改运行时本身来添加新方法.
看来你不能使用Java代理来修改Object,String,ClassLoader,Class<?>,ProtectionDomain,IllegalClassFormatException,和数组类.
如果要创建一个不直接或间接从中派生的类,则java.lang.Object必须创建一个没有指定超类的类文件.
现在,如果您查看解析类文件的JDK代码,您会发现类文件解析器执行此检查:
if (super_class_index == 0) {
check_property(class_name == vmSymbols::java_lang_Object(),
"Invalid superclass index %u in class file %s",
super_class_index,
CHECK_(nullHandle));
} else {
Run Code Online (Sandbox Code Playgroud)
所以它会拒绝你的基类.只能java.lang.Object没有超类.
该规则在JLS第8.1.4节中规定:
[T]类型C的直接超类是如果存在extends子句则在C的声明的extends子句中给出的类型,否则是Object.
每个类都是直接子类Object,通过不提供extends子句或通过显式扩展Object,或Object通过显式扩展的另一个子类的间接子类Object.
因此,此类层次结构中的类必须直接或间接扩展Object; 没有其他独立的对象层次结构Object.
| 归档时间: |
|
| 查看次数: |
715 次 |
| 最近记录: |