除了重新编译之外,rt.jar
还有什么方法可以用currentTimeMillis()
我自己的一个替换调用?
1#正确的方法是使用Clock
对象和抽象时间。
我知道,但是我们将运行由大量尚未实现Clock
或自己实现的开发人员开发的代码。
2#使用JMockit之类的模拟工具模拟该类。
即使仅在禁用Hotspot的情况下有效,-Xint
并且使用下面的代码也成功,但它不会“持久化”在外部库上。这意味着您必须在所有地方都进行模拟,因为代码不受我们的控制,因此这是不可行的。下的所有代码main()
的确返回0毫秒(如示例所示),但是a
new DateTime()
将返回实际的系统毫秒数。
@MockClass(realClass = System.class)
public class SystemMock extends MockUp<System> {
// 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.loader
JVM轻松替换系统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]
我没有其他选择了。
我缺少一些方法吗?
您可以使用AspectJ编译器/编织器来编译/编织有问题的用户代码,将对java.lang.System.currentTimeMillis()的调用替换为您自己的代码。以下方面将做到这一点:
public aspect CurrentTimeInMillisMethodCallChanger {
long around():
call(public static native long java.lang.System.currentTimeMillis())
&& within(user.code.base.pckg.*) {
return 0; //provide your own implementation returning a long
}
}
除了重新编译之外,是否有任何方法可以将调用替换为我自己的调用? 1#正确的方法是使用对象和抽象时间。 即使这只适用于Hotspot禁用的,并且我们成功地使用了代码,但它并不“持久”于外部库。这意味着您必须在任何地方对其进行嘲弄,因为代码不在我们的控制范围内,这是不可行的。下的所有代码都返回0毫厘(如示例所示),但将返回实际的系统毫厘。 3#在启动时使用(已编辑)重新声明 虽然可能,并且可以创建/更
问题内容: 假设我的格式如下: 我想将小数点替换为空白,使其看起来像这样: 我该怎么做呢?我以为可以解决问题,但是当我尝试这样时: 我收到了一个错误消息,因为它可能不是字符。那是有道理的,那么我还能怎么完成我想要的? 问题答案: 如果您只是将单引号换成双引号,那么这将起作用,因为空字符串是合法值,而不是“空字符”,并且有重载。请记住,这是的超类型。
问题内容: 我有一个以字符串形式传递的句子,我正在对单词“ and”进行替换,我想用“”替换它。而且它不是用空格替换“和”一词。以下是我的逻辑示例。而当我调试此逻辑时,逻辑确实落入了句子。 这里有我想念的东西吗? 问题答案: 而当我调试此逻辑时,逻辑确实落入了句子。 是的,然后你放弃返回值。 Java中的字符串是不可变的-当你调用时,它不会更改现有字符串的内容-它会返回经过修改的新字符串。所以你要
我有一个作为字符串传入的句子,我正在对单词“and”进行替换,我想用“”替换它。它并没有用空白代替“和”。下面是我的逻辑示例。当我调试这个的时候,逻辑就落在句子里了。代替 这里有我遗漏的东西吗。
我正在尝试使用AST转换替换类的方法。 我首先检查该方法是否存在,然后将其删除(基于此)。 我看到集合上的大小发生了变化,但该方法仍然可以在类节点上访问。 删除该方法后,我想添加一个同名的新方法: 但是,这会导致以下错误: 正确的方法是什么? 更新:由于我打算做的就是替换该方法的现有功能,因此我创建了一个新的块语句,并使用 在现有方法上设置了它。
Note: 这个特性从 FreeMarker 2.3.4 版本后才存在。 FreeMarker支持一个替换的语法。就是在FreeMarker的指令和注释中用 [ 和 ] 来代替 < 和 >,例如下面这个例子: 调用预定义指令:[#list animals as animal]...[/#list] 调用自定义指令:[@myMacro /] 注释:[#-- the comment --] 为了使用这