Прочитайте файл класса и замените содержимое файла класса - PullRequest
0 голосов
/ 21 мая 2018

Я компилирую этот файл Java и получаю один файл класса.Моя задача состоит в том, чтобы изменить статическое содержимое «Hello» в файле Class и заменить на «Hi».Как сначала прочитать файл класса и как заменить статический контент?

public class test {

 public static void main(String[] args) {
     System.out.println("Hello");
 }

}

Существует ли для этого какой-либо стандартный код (шаблон)?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Ваше решение должно быть на Java?Вы можете использовать Jawa для достижения того же в Python с гораздо меньшим количеством шаблонов, чем ASM и его эквиваленты.

Установите его: pip install jawa

Затем:

from jawa.constants import String
from jawa.classloader import ClassLoader

# Create a ClassLoader for the current directory
# and load your "test" class.
test = ClassLoader('.')['test']

# Find the first String with the value "Hello"
# in the constant pool.
constant = test.constants.find_one(
    type_=String,
    f=lambda c: c.string.value == 'Hello'
)
# Change it to your new value
constant.string.value = 'Hi'

# ... and save the new class.
with open('test.class', 'wb') as new_test:
    test.save(new_test)

Результат:

$ java test
Hi

Полная документация на http://jawa.tkte.ch. Независимо от того, каким инструментом вы в конечном итоге пользуетесь, абсолютно необходимо прочитать спецификацию JVM ClassFile, иначе вы действительно не поймете, что происходит.Вы можете найти его на https://docs.oracle.com/javase/specs/jvms/se10/html/jvms-4.html.

0 голосов
/ 21 мая 2018

Вам необходимо использовать некоторые библиотеки инструментария байт-кода Java, такие как ASM.Хорошо бы начать читать ссылки:

...