我有类文件中有这样的方法:修改字节码,使一个方法返回真
public boolean validate(String str) {}
那里有很多这种验证方法中的代码,但我只想让它总是返回true或错误。有人能指出我如何修改一个类文件来达到这个目的吗?
我有类文件中有这样的方法:修改字节码,使一个方法返回真
public boolean validate(String str) {}
那里有很多这种验证方法中的代码,但我只想让它总是返回true或错误。有人能指出我如何修改一个类文件来达到这个目的吗?
根据提供的方法签名,它只能返回true或false。
您可以创建一个包装类,它将调用委托给原始对象,并覆盖所需的行为,而不是试图操纵字节码?
修改字节码的最简单方法是反编译类或获取源代码的副本。更改代码并编译它。将新版本放在类路径中,或者将旧版本替换为jar。这样你就改变了方法。
您可以在运行时更改它,但这是100倍困难。 ;)
您是否试图单元测试此代码并强制回答而不关心条件?如果是这种情况,那么你正在寻找“模拟”框架。在Java中,我可以将Mockito和EasyMock想象成我的头顶。
相关地,可以使用PowerMock(串联作品与上述任一嘲讽框架)动态地改变类(如final
类/方法,static
方法,甚至private
件类)。 PowerMock实际上可以在必要时更改字节码。检查其类加载文件夹下。
我从来没有考虑过它,但可能在非测试代码中使用它们中的任何一个,但它们可能需要努力避免JUnit依赖项(例如JUnit Runner)。再一次,我从来没有想过它,所以我从来没有想过通过这些影响。
至少,您可以通过PowerMockito查看它们如何更改字节码。
如果你只是想单元测试,那么它非常容易,你可能不需要担心字节码。
public class SomeClass {
public boolean validate(String s) {
// tons of logic
}
}
试验(使用的Mockito使用JUnit 4(放弃对的JUnit 3)@Test
属性):
private final MyClassBeingTested testClass = new MyClassBeingTested();
@Test
public void testMyCodeWithSomeClass() {
SomeClass some = mock(SomeClass.class);
when(some.validate(anyString())).thenReturn(eq(true));
// whenever it uses "some.validate()", with any
// string, then it will return true
testClass.useSomeClass(some);
// assert whatever conditions you want
// if you care to ensure that it called validate:
// note: times(1) is implied if not supplied, but times(0), times(2), etc.
// could be used ("never()" exists as a synonym for times(0))
verify(some, times(1)).validate(anyString());
}
RULE倍率RTN 类Foo 方法Validate IF真 DO返回TRUE ENDRULE
您的解决方案很有趣,我会试一试。但无论如何,你是唯一能理解我的问题的人,谢谢。 – Sawyer 2011-05-30 15:30:21
否。此方法在内部调用。不受我控制。这是一种黑客入侵的方法。 – Sawyer 2011-05-29 06:33:51