отсутствует оператор while после добавления строки с помощью редактора байтового кода Java - PullRequest
0 голосов
/ 21 февраля 2019

Мой исходный код 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.Большое спасибо.

...