1

我有类文件中有这样的方法:修改字节码,使一个方法返回真

public boolean validate(String str) {} 

那里有很多这种验证方法中的代码,但我只想让它总是返回true或错误。有人能指出我如何修改一个类文件来达到这个目的吗?

回答

1

根据提供的方法签名,它只能返回true或false。
您可以创建一个包装类,它将调用委托给原始对象,并覆盖所需的行为,而不是试图操纵字节码?

+0

否。此方法在内部调用。不受我控制。这是一种黑客入侵的方法。 – Sawyer 2011-05-29 06:33:51

1

修改字节码的最简单方法是反编译类或获取源代码的副本。更改代码并编译它。将新版本放在类路径中,或者将旧版本替换为jar。这样你就改变了方法。

您可以在运行时更改它,但这是100倍困难。 ;)

+0

但是,如何强制反编译的代码重新编译?对于只有一个类需要编辑的大型项目,我的运气非常糟糕,但由于依赖关系,我不得不编译整个项目。 – Wyatt8740 2017-04-13 18:53:56

+0

@ Wyatt8740这取决于你的变化有多严重,但是你应该只能重新编译一个类,即使这些工具可能不知道你不需要重新编译。 – 2017-04-15 06:21:34

+0

嗯,我只是让一个方法返回'0'。但'javac'明显需要其他源文件。也许有涉及继承或什么的。我没有使用IDE或构建系统;只是命令行中的java编译器。 – Wyatt8740 2017-04-15 18:07:22

2

您是否试图单元测试此代码并强制回答而不关心条件?如果是这种情况,那么你正在寻找“模拟”框架。在Java中,我可以将MockitoEasyMock想象成我的头顶。

相关地,可以使用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()); 
} 
5

RULE倍率RTN 类Foo 方法Validate IF真 DO返回TRUE ENDRULE

http://www.jboss.org/byteman

+1

您的解决方案很有趣,我会试一试。但无论如何,你是唯一能理解我的问题的人,谢谢。 – Sawyer 2011-05-30 15:30:21

相关问题