您可以创建一个没有Object作为其基类的类结构

Ima*_*ago 13 java jvm object

据我所知: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,和数组类.


wer*_*ero 9

如果要创建一个不直接或间接从中派生的类,则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没有超类.


rge*_*man 8

该规则在JLS第8.1.4节中规定:

[T]类型C的直接超类是如果存在extends子句则在C的声明的extends子句中给出的类型,否则是Object.

每个类都是直接子类Object,通过不提供extends子句或通过显式扩展Object,或Object通过显式扩展的另一个子类的间接子类Object.

因此,此类层次结构中的类必须直接或间接扩展Object; 没有其他独立的对象层次结构Object.