是否可以创建一个不将 Object 作为其基类的类结构

2022-09-04 06:00:40

据我所知:Java中的每个类都继承了Object类的方法,而无需指定这样做,这使得这个类如此独特和有趣。

因此,我想知道,在JVM中,这个“规则”在哪里指定?是否可以以某种方式操作此类,例如添加或删除方法或变量?是否可以创建独立于 Object 类的并行分层结构?


答案 1

这个类本身确实是特殊的。如果你在 jre 文件夹中查看它的实现,你会发现它的大多数方法只是带有修饰符的声明。Objectrt.jarnative

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 {}
}

这些本机方法是在 JVM 本身内部实现的。这些方法是 Java 程序的本机部分和托管部分之间的桥梁。正因为如此,将这个类作为“每个对象中的共同事物”是很自然的。Java 语言的指定方式是,除了 之外,没有办法构建单独的类层次结构。ObjectObject

关于修改Object

虽然我还没有尝试过,但也许可以修改原始的 Object 类。可以肯定的是,现有方法无法删除,因为大多数运行时都依赖于它们,但是我看到您可以通过修改运行时本身来添加新方法的机会。

您似乎不能使用 java 代理来修改 、、、、、和数组类。ObjectStringClassLoaderClass<?>ProtectionDomainIllegalClassFormatException


答案 2

如果要创建一个不直接或间接派生的类,则必须创建一个未指定超类的类文件。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 {

所以它会拒绝你的基类。只能没有超类。java.lang.Object