当前位置: 首页 > 面试题库 >

入侵java.lang.Object:调用自定义外部类会使JVM崩溃

夏侯嘉荣
2023-03-14
问题内容

我正在为Java运行时环境编辑java.lang.Object。我意识到可能有更好的方法来做我想做的事,但这不是我的问题。

基本上,我已经向java.lang.Object添加了一个构造函数,该构造函数在每次创建对象时都会调用。我正在等待某个类的加载,如下所示:

public Object() {
       if (hookEnabled) {
            hookEnabled = false;
        objectCount++;
        if (objectCount > objectStartCount) {
            if (this.getClass() != null) {
                String name = this.getClass().getName();
                if ((!name.startsWith("java.")) && (!name.startsWith("javax.")) && (!name.startsWith("launcher.")) && (!name.startsWith("sunw.")) && (!name.startsWith("com.sun.")) && (!name.startsWith("sun.")) && (!name.startsWith("org.xml.")) && (!name.startsWith("org.w3c.")) && (!name.startsWith("org.omg.")) && (!name.startsWith("org.ietf."))) {
                    if (!hasHooked) {
                        hasHooked = true;

//startup beep
        java.awt.Toolkit.getDefaultToolkit().beep();

        //load interface
        javax.swing.JFrame frame = new javax.swing.JFrame("");
        frame.setBounds(0, 0, 400, 400);
        frame.setAlwaysOnTop(true);
        frame.setVisible(true);

                    }
                }
            }
        }
         hookEnabled = true;
        }
    }

这很好。它为JVM正在运行的任何应用程序添加了一个窗口。

但是,当通过将JFrame代码移到单独的类中进行简单更改并调用该调用时,JVM只会崩溃:

public Object() {
            if (hookEnabled) {
            hookEnabled = false;
        objectCount++;
        if (objectCount > objectStartCount) {
            if (this.getClass() != null) {
                String name = this.getClass().getName();
                if ((!name.startsWith("java.")) && (!name.startsWith("javax.")) && (!name.startsWith("launcher.")) && (!name.startsWith("sunw.")) && (!name.startsWith("com.sun.")) && (!name.startsWith("sun.")) && (!name.startsWith("org.xml.")) && (!name.startsWith("org.w3c.")) && (!name.startsWith("org.omg.")) && (!name.startsWith("org.ietf."))) {
                    if (!hasHooked) {
                        hasHooked = true;
                        (new tvmh.DFVMH()).setup(); 
                    }
                }
            }
        }
           hookEnabled = true;
        }
    }

-

 package tvmh;

    public class DFVMH {
        public void setup() {
            //startup beep
            java.awt.Toolkit.getDefaultToolkit().beep();

            //load interface
            javax.swing.JFrame frame = new javax.swing.JFrame("");
            frame.setBounds(0, 0, 400, 400);
            frame.setAlwaysOnTop(true);
            frame.setVisible(true);
        }
    }

当我尝试创建java.util.Timer对象时,也会发生相同的情况。

有趣的是,如果我使DFVMH成为java.lang.Object本身的内联类(内部类),则上述方法确实有效。

谁能告诉我为什么会发生这种情况?有什么方法可以安全地调用此类自定义类吗?


问题答案:

像这样修补JVM的内部风险很大。在JVM的低层上存在各种可能会破坏的隐藏依赖项。JVM引导程序是一个非常微妙的过程。

例如,您看到崩溃而不是的最可能原因StackOverflowError是您的更改破坏了 所有 对象的构造……包括错误对象的构造。

而且我怀疑您的保护代码无效,因为它this.getClass().getName()可能导致创建String对象。因此,致命的递归发生在您警惕之前。

(顺便说一句,您的hasHooked旗帜介绍了比赛条件。)

我的建议是“不要这样做!”。



 类似资料:
  • 问题内容: 如何导入在其他文件中编写的类?我所有的课程都在同一个程序包下。 问题答案: 如果所有类都在同一个程序包中,则无需导入它们。 只需像这样实例化该对象:

  • 外部定义 有时候创建一个由多个不同检出得到的工作拷贝是非常有用的,举个例子,你或许希望不同的子目录来自不同的版本库位置,或者是不同的版本库。你可以手工设置这样一个工作拷贝—使用svn checkout来创建这种你需要的嵌套的工作拷贝结构。但是如果这个结构对所有的用户是很重要的,每个用户需要执行同样的检出操作。 很幸运,Subversion提供了外部定义的支持,一个外部定义是一个本地路经到URL的影

  • 希望你做得很好。 我有一个C语言的JNI实现,其中一个C函数连接到当前JVM线程并回调一个Java方法,这实际上是在attachCurrentThread()函数调用时使JVM崩溃。我的实现基于链接中给出的答案,保持对JNIEnv环境的全局引用 线程创建部分,它将侦听套接字连接以接受事件并注入GetEvent函数。 回调函数 在接收到事件时执行GetEvent()后,我的JVM在AttachMon

  • 本章节中,简述自定义类的创建和使用方法,供参考。 创建自定义类 用户可以定义自己的类,通过继承 ThingJS 内部类(比如:Thing 类),对 ThingJS 进行扩展和封装。 我们推荐使用 ES6 语法定义一个类。例如,自定义汽车类 Car。 // 继承 Thing 类 class Car extends THING.Thing { constructor(app) { super(

  • 问题内容: 我是Java的新手,但我一直在网上寻找解决方案,但似乎都没有用。请帮我。 我有两个文件。其中之一是包含主要功能的java文件。在里面: 使用该命令,我想创建一个新对象,该对象是一个名为的单独文件中的类。但是Java无法识别VaporVisitor是什么,大概是因为它不知道存在(它在同一目录中)。我试图使它们成为同一程序包的一部分,放入不同的程序包中并导入…,但所有这些都失败了。谁能给我

  • 问题内容: 我想自定义HTML5中范围输入类型的外观,使其看起来像进度条。我尝试使用CSS类应用一些常见的CSS属性,但似乎它们不起作用。 谁能指导我如何自定义它? 问题答案: 编辑 :如今所有主要浏览器都支持 <进度> 输入[类型=’范围’ 因此, 您应该使用这两个方法之一,如其他答案中所述 ,这不再是公认的答案。 的是非常新的,您已经尝试使用CSS对其进行自定义。:) 我不会尝试这样做有两个原