所以我的界面很小
public interface IPlayersStorage
{
// other methods...
public boolean addException(final String nick);
// other methods...
}
和实现它的“PlayersStorage”类:(仅使用部分)
public class PlayersStorage implements IPlayersStorage
{
private static final PlayersStorage inst = new PlayersStorage();
private final Set<String> exceptions = new HashSet<>(50);
@Override
public boolean addException(final String nick)
{
return ! this.exceptions.add(nick);
}
public static PlayersStorage getStorage()
{
return inst;
}
}
在某些地方,我使用该代码使用该方法:
for (final String player : this.cfg.getStringList("Exceptions"))
{
PlayersStorage.getStorage().addException(player);
}
ProGuard将其更改为:
for (Iterator localIterator1 = this.cfg.getStringList("Exceptions").iterator(); localIterator1.hasNext();)
{
localIterator1.next();
PlayersStorage.getStorage(); // it's get object, but don't do anything with it...
}
我找到的唯一可能的解决方法是将静态方法添加到PlayersStorage
public static boolean staticAddException(final String nick)
{
return inst.addException(nick);
}
然后使用它(而不是旧代码)
for (final String player : this.cfg.getStringList("Exceptions"))
{
PlayersStorage.staticAddException(player);
}
然后工作......(ProGuard保持方法调用)但是从界面为每个方法添加静态方法并不是一个好主意。
答案 0 :(得分:0)
ProGuard只会删除方法调用,如果它们没有任何效果(这里似乎不是这种情况),或者您已为方法指定了-assumenosideffects
。您应检查配置并删除任何此类选项。
或者,您的反编译器可能在反编译代码时遇到问题。然后,您应该使用javap -c
检查实际的字节码。