Мой исходный код Java пропал, поэтому мне нужно редактировать .class напрямую.Вот конкретное тело метода из всего файла .class, которое мне нужно изменить, декомпилированное представление с помощью JD GUI:
public static BigDecimal countKilosonName(TicketInfo paramTicketInfo)
{
int i = 0;
BigDecimal localBigDecimal = new BigDecimal(0);
while (i < paramTicketInfo.getLinesCount())
{
String str1 = paramTicketInfo.getLine(i).getProductName();
int j = (int)paramTicketInfo.getLine(i).getMultiply();
Pattern localPattern = Pattern.compile("\\([+-]?([0-9]*[.])?[0-9]+ (kg|KG|Kg|kG)\\)");
Matcher localMatcher = localPattern.matcher(str1);
String str2 = "";
if (localMatcher.find())
{
str2 = localMatcher.group();
String str3 = str2.replaceAll(" (?i)kg", "").replaceAll("\\(", "").replaceAll("\\)", "");
double d = j * Double.parseDouble(str3);
localBigDecimal = localBigDecimal.add(BigDecimal.valueOf(d));
paramTicketInfo.getLine(i).setProperty("product.name.altered", paramTicketInfo.getLine(i).getProductName().replace("(" + str3 + " kg)", "(" + d + " kg)"));
}
i++;
}
return localBigDecimal;
}
Вот начальный редактор байт-кода:
iconst_0
istore_1
new java/math/BigDecimal
dup
iconst_0
invokespecial java/math/BigDecimal/<init>(I)V
astore_2
iload_1
aload_0
invokevirtual com/openbravo/pos/ticket/TicketInfo/getLinesCount()I
if_icmpge 92
aload_0
iload_1
invokevirtual com/openbravo/pos/ticket/TicketInfo/getLine(I)Lcom/openbravo/pos/ticket/TicketLineInfo;
invokevirtual com/openbravo/pos/ticket/TicketLineInfo/getProductName()Ljava/lang/String;
astore_3
aload_0
iload_1
invokevirtual com/openbravo/pos/ticket/TicketInfo/getLine(I)Lcom/openbravo/pos/ticket/TicketLineInfo;
invokevirtual com/openbravo/pos/ticket/TicketLineInfo/getMultiply()D
d2i
istore 4
ldc_w "\([+-]?([0-9]*[.])?[0-9]+ (kg|KG|Kg|kG)\)"
invokestatic java/util/regex/Pattern/compile(Ljava/lang/String;)Ljava/util/regex/Pattern;
astore 5
aload 5
aload_3
invokevirtual java/util/regex/Pattern/matcher(Ljava/lang/CharSequence;)Ljava/util/regex/Matcher;
astore 6
ldc ""
astore 7
aload 6
invokevirtual java/util/regex/Matcher/find()Z
ifeq 90
aload 6
invokevirtual java/util/regex/Matcher/group()Ljava/lang/String;
astore 7
aload 7
ldc_w " (?i)kg"
ldc ""
invokevirtual java/lang/String/replaceAll(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
ldc_w "\("
ldc ""
invokevirtual java/lang/String/replaceAll(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
ldc_w "\)"
ldc ""
invokevirtual java/lang/String/replaceAll(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
astore 8
iload 4
i2d
aload 8
invokestatic java/lang/Double/parseDouble(Ljava/lang/String;)D
dmul
dstore 9
aload_2
dload 9
invokestatic java/math/BigDecimal/valueOf(D)Ljava/math/BigDecimal;
invokevirtual java/math/BigDecimal/add(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;
astore_2
aload_0
iload_1
invokevirtual com/openbravo/pos/ticket/TicketInfo/getLine(I)Lcom/openbravo/pos/ticket/TicketLineInfo;
ldc_w "product.name.altered"
aload_0
iload_1
invokevirtual com/openbravo/pos/ticket/TicketInfo/getLine(I)Lcom/openbravo/pos/ticket/TicketLineInfo;
invokevirtual com/openbravo/pos/ticket/TicketLineInfo/getProductName()Ljava/lang/String;
new java/lang/StringBuilder
dup
invokespecial java/lang/StringBuilder/<init>()V
ldc_w "("
invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder;
aload 8
invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder;
ldc_w " kg)"
invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invokevirtual java/lang/StringBuilder/toString()Ljava/lang/String;
new java/lang/StringBuilder
dup
invokespecial java/lang/StringBuilder/<init>()V
ldc_w "("
invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder;
dload 9
invokevirtual java/lang/StringBuilder/append(D)Ljava/lang/StringBuilder;
ldc_w " kg)"
invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invokevirtual java/lang/StringBuilder/toString()Ljava/lang/String;
invokevirtual java/lang/String/replace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String;
invokevirtual com/openbravo/pos/ticket/TicketLineInfo/setProperty(Ljava/lang/String;Ljava/lang/String;)V
iinc 1 1
goto 8
aload_2
areturn
В строке 84 iзаменить:
invokevirtual java/lang/StringBuilder/append(D)Ljava/lang/StringBuilder;
на
invokestatic java/math/BigDecimal/valueOf(D)Ljava/math/BigDecimal;
invokevirtual java/lang/StringBuilder/append(Ljava/math/BigDecimal;)Ljava/lang/StringBuilder;
Моя цель - изменить исходный код:
... .setProperty("product.name.altered", paramTicketInfo.getLine(i).getProductName().replace("(" + str3 + " kg)", "(" + d + " kg)"));
на
... .setProperty("product.name.altered", paramTicketInfo.getLine(i).getProductName().replace("(" + str3 + " kg)", "(" + BigDecimal.valueOf(d) + " kg)"));
, потому чтоЯ получил известную проблему с длинным десятичным числом, используя double, поэтому мне нужно изменить ее на BigDecimal.
Но когда я нажимаю кнопку «Сохранить метод» в редакторе байт-кода Java, что-то не так, тогда, когда я снова открываю .class с помощью JD GUI, строка while (i < paramTicketInfo.getLinesCount())
исчезает и заменяется только for (;;)
,Хотя смена строки с d
на BigDecimal.valueOf(d)
выглядела неплохо.Извините, если, скорее всего, мне не хватает базовых знаний байт-кода .class.Мой план, если редактирование байт-кода будет успешным, я сгенерирую новый класс, используя ASM для пересчета стека, приемлемого, затем, используя 7-zip, я прикреплю его обратно к файлу .jar.Большое спасибо.