是否可以创建一个不将 Object 作为其基类的类结构
据我所知:Java中的每个类都继承了Object类的方法,而无需指定这样做,这使得这个类如此独特和有趣。
因此,我想知道,在JVM中,这个“规则”在哪里指定?是否可以以某种方式操作此类,例如添加或删除方法或变量?是否可以创建独立于 Object 类的并行分层结构?
据我所知:Java中的每个类都继承了Object类的方法,而无需指定这样做,这使得这个类如此独特和有趣。
因此,我想知道,在JVM中,这个“规则”在哪里指定?是否可以以某种方式操作此类,例如添加或删除方法或变量?是否可以创建独立于 Object 类的并行分层结构?
这个类本身确实是特殊的。如果你在 jre 文件夹中查看它的实现,你会发现它的大多数方法只是带有修饰符的声明。Object
rt.jar
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 {}
}
这些本机方法是在 JVM 本身内部实现的。这些方法是 Java 程序的本机部分和托管部分之间的桥梁。正因为如此,将这个类作为“每个对象中的共同事物”是很自然的。Java 语言的指定方式是,除了 之外,没有办法构建单独的类层次结构。Object
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 {
所以它会拒绝你的基类。只能没有超类。java.lang.Object