java 更改 currenttime_java.lang.System.currentTimeMillis()替换方法

除了重新编译之外,rt.jar还有什么方法可以用currentTimeMillis()我自己的一个替换调用?

1#正确的方法是使用Clock对象和抽象时间。

我知道,但是我们将运行由大量尚未实现Clock或自己实现的开发人员开发的代码。

2#使用JMockit之类的模拟工具模拟该类。

即使仅在禁用Hotspot的情况下有效,-Xint并且使用下面的代码也成功,但它不会“持久化”在外部库上。这意味着您必须在所有地方都进行模拟,因为代码不受我们的控制,因此这是不可行的。下的所有代码main()的确返回0毫秒(如示例所示),但是a

new DateTime()将返回实际的系统毫秒数。

@MockClass(realClass = System.class)

public class SystemMock extends MockUp {

// returns 1970-01-01

@Mock public static long currentTimeMillis() { return 0; }

}

3#System使用-Xbootclasspath/p(已编辑) 重新声明 启动

在可能的情况下,尽管您可以创建/更改方法,但有问题的方法声明为public static native long

currentTimeMillis();。您必须先深入研究Sun的专有和 本机

代码,才能更改其声明,这将使之成为逆向工程,而且几乎不是一种稳定的方法。所有最近的SUN JVM崩溃,并出现以下错误:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000, pid=4668, tid=5736

4#使用自定义的ClassLoader (评论中建议的新测试)

尽管使用-Djava.system.class.loaderJVM轻松替换系统CL的过程实际上是通过默认的classLoader加载了自定义classLoader,并且系统甚至没有通过自定义CL。

public class SimpleClassLoader extends ClassLoader {

public SimpleClassLoader(ClassLoader classLoader) {

super(classLoader);

}

@Override

public Class> loadClass(String name) throws ClassNotFoundException {

return super.loadClass(name);

}

}

我们可以看到,java.lang.System从装载rt.jar使用java -verbose:class

Line 15: [Loaded java.lang.System from C:\jdk1.7.0_25\jre\lib\rt.jar]

我没有其他选择了。

我缺少一些方法吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值