除了重新编译rt.jar
之外,是否有任何方法可以将CurrentTimeMillis()
调用替换为我自己的调用?
1#正确的方法是使用clock
对象和抽象时间。
即使这只适用于Hotspot禁用的-xint
,并且我们成功地使用了代码,但它并不“持久”于外部库。这意味着您必须在任何地方对其进行嘲弄,因为代码不在我们的控制范围内,这是不可行的。main()
下的所有代码都返回0毫厘(如示例所示),但new DateTime()
将返回实际的系统毫厘。
@MockClass(realClass = System.class)
public class SystemMock extends MockUp<System> {
// returns 1970-01-01
@Mock public static long currentTimeMillis() { return 0; }
}
3#在启动时使用-Xbootclasspath/p
(已编辑)重新声明system
虽然可能,并且可以创建/更改方法,但所讨论的方法被声明为public static native long currentTimeMillis();
。如果不深入Sun的专有代码和本机代码,您就无法更改它的声明,这将使这成为一种反向工程练习,而不是一种稳定的方法。所有最近的SUN JVM都崩溃,错误如下:
EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000, pid=4668, tid=5736
4#使用自定义类加载器(注释中建议的新测试)
使用-djava.system.class.loader
替换系统CL,虽然很简单,JVM实际上加载了自定义的类加载器,使用默认的类加载器,系统甚至不会被推到自定义的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
是使用java-verbose:class
从rt.jar
加载的
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#正确的方法是使用对象和抽象时间。 我知道,但是我们将运行由大量尚未实现或自己实现的开发人员开发的代码。 2#使用JMockit之类的模拟工具模拟该类。 即使仅在禁用Hotspot的情况下有效,并且使用下面的代码也成功,但它不会“持久化”在外部库上。这意味着您必须在所有地方都进行模拟,因为代码不受我们的控制,因此这是不可行的
问题内容: 假设我的格式如下: 我想将小数点替换为空白,使其看起来像这样: 我该怎么做呢?我以为可以解决问题,但是当我尝试这样时: 我收到了一个错误消息,因为它可能不是字符。那是有道理的,那么我还能怎么完成我想要的? 问题答案: 如果您只是将单引号换成双引号,那么这将起作用,因为空字符串是合法值,而不是“空字符”,并且有重载。请记住,这是的超类型。
问题内容: 我有一个以字符串形式传递的句子,我正在对单词“ and”进行替换,我想用“”替换它。而且它不是用空格替换“和”一词。以下是我的逻辑示例。而当我调试此逻辑时,逻辑确实落入了句子。 这里有我想念的东西吗? 问题答案: 而当我调试此逻辑时,逻辑确实落入了句子。 是的,然后你放弃返回值。 Java中的字符串是不可变的-当你调用时,它不会更改现有字符串的内容-它会返回经过修改的新字符串。所以你要
我有一个作为字符串传入的句子,我正在对单词“and”进行替换,我想用“”替换它。它并没有用空白代替“和”。下面是我的逻辑示例。当我调试这个的时候,逻辑就落在句子里了。代替 这里有我遗漏的东西吗。
我正在尝试使用AST转换替换类的方法。 我首先检查该方法是否存在,然后将其删除(基于此)。 我看到集合上的大小发生了变化,但该方法仍然可以在类节点上访问。 删除该方法后,我想添加一个同名的新方法: 但是,这会导致以下错误: 正确的方法是什么? 更新:由于我打算做的就是替换该方法的现有功能,因此我创建了一个新的块语句,并使用 在现有方法上设置了它。
Note: 这个特性从 FreeMarker 2.3.4 版本后才存在。 FreeMarker支持一个替换的语法。就是在FreeMarker的指令和注释中用 [ 和 ] 来代替 < 和 >,例如下面这个例子: 调用预定义指令:[#list animals as animal]...[/#list] 调用自定义指令:[@myMacro /] 注释:[#-- the comment --] 为了使用这