我正在为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
旗帜介绍了比赛条件。)
我的建议是“不要这样做!”。
问题内容: 如何导入在其他文件中编写的类?我所有的课程都在同一个程序包下。 问题答案: 如果所有类都在同一个程序包中,则无需导入它们。 只需像这样实例化该对象:
希望你做得很好。 我有一个C语言的JNI实现,其中一个C函数连接到当前JVM线程并回调一个Java方法,这实际上是在attachCurrentThread()函数调用时使JVM崩溃。我的实现基于链接中给出的答案,保持对JNIEnv环境的全局引用 线程创建部分,它将侦听套接字连接以接受事件并注入GetEvent函数。 回调函数 在接收到事件时执行GetEvent()后,我的JVM在AttachMon
外部定义 有时候创建一个由多个不同检出得到的工作拷贝是非常有用的,举个例子,你或许希望不同的子目录来自不同的版本库位置,或者是不同的版本库。你可以手工设置这样一个工作拷贝—使用svn checkout来创建这种你需要的嵌套的工作拷贝结构。但是如果这个结构对所有的用户是很重要的,每个用户需要执行同样的检出操作。 很幸运,Subversion提供了外部定义的支持,一个外部定义是一个本地路经到URL的影
本章节中,简述自定义类的创建和使用方法,供参考。 创建自定义类 用户可以定义自己的类,通过继承 ThingJS 内部类(比如:Thing 类),对 ThingJS 进行扩展和封装。 我们推荐使用 ES6 语法定义一个类。例如,自定义汽车类 Car。 // 继承 Thing 类 class Car extends THING.Thing { constructor(app) { super(
问题内容: 我想自定义HTML5中范围输入类型的外观,使其看起来像进度条。我尝试使用CSS类应用一些常见的CSS属性,但似乎它们不起作用。 谁能指导我如何自定义它? 问题答案: 编辑 :如今所有主要浏览器都支持 <进度> 输入[类型=’范围’ 因此, 您应该使用这两个方法之一,如其他答案中所述 ,这不再是公认的答案。 的是非常新的,您已经尝试使用CSS对其进行自定义。:) 我不会尝试这样做有两个原
问题内容: 我是Java的新手,但我一直在网上寻找解决方案,但似乎都没有用。请帮我。 我有两个文件。其中之一是包含主要功能的java文件。在里面: 使用该命令,我想创建一个新对象,该对象是一个名为的单独文件中的类。但是Java无法识别VaporVisitor是什么,大概是因为它不知道存在(它在同一目录中)。我试图使它们成为同一程序包的一部分,放入不同的程序包中并导入…,但所有这些都失败了。谁能给我