Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
 Аватар для 646kapeh064
59 / 58 / 16
Регистрация: 09.12.2013
Сообщений: 208

Модификация кода в Run-time

15.12.2013, 13:39. Показов 1429. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Есть одна программа и вторая программа, запускаю так:
javaw -Xms512m -Xmx1024m -Dsun.java2d.noddraw=true -Dsun.java2d.d3d=false -Dsun.java2d.opengl=false -Dsun.java2d.pmoffscreen=false -classpath "%CD%\prog1.exe";"%CD%\prog2.jar" -javaagent:"%CD%\prog2.jar" ru.prog2.mmain

В prog2.jar я запускаю prog1.jar и все работает )
Но вопрос вот в чем, можно ли в сторонней либе (т.к. запускаю prog2.jar, то prog1.jar у меня подключена к проекту как библиотека) изменить какую-нибудь функцию на лету. Например, я знаю что prog1.jar выполняет, грубо говоря, в классе ru.core.A функцию B, можно ли как-нибудь изменить её или поучавствовать в её выполнении?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.12.2013, 13:39
Ответы с готовыми решениями:

Как из С# программно обработать Run-time error '1004' VBA кода книги Excel
Может кто подскажет, как программно в C# завершить работу макроса в книге Excel? Существует книга со встроенными макросами, которая...

Разница в координатах в run-time и design-time
Может кто-нибудь объяснить почему координаты любого объекта(например Tshape) отличаются во время run и design? Например если создать...

Разница в координатах в run-time и design-time
Может кто-нибудь объяснить почему координаты любого объекта(например Tshape) отличаются во время run и design? Например если создать...

9
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
15.12.2013, 15:02
Цитата Сообщение от 646kapeh064 Посмотреть сообщение
грубо говоря, в классе ru.core.A функцию B, можно ли как-нибудь изменить её или поучавствовать в её выполнении?
да всё вполне возможно, когда в java появятся функции - думаю проблем не будет ваще )
1
510 / 272 / 60
Регистрация: 14.12.2010
Сообщений: 548
15.12.2013, 18:49
Цитата Сообщение от 646kapeh064 Посмотреть сообщение
я знаю что prog1.jar выполняет, грубо говоря, в классе ru.core.A функцию B, можно ли как-нибудь изменить её или поучавствовать в её выполнении?
Посмотри на АОП.
Например в Spring.
1
 Аватар для 646kapeh064
59 / 58 / 16
Регистрация: 09.12.2013
Сообщений: 208
15.12.2013, 18:59  [ТС]
EVP, спасибо за направление )
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
15.12.2013, 20:08
EVP, зачем же направлять человека в неправильном направлении ?
где в АОП есть изменение метода на лету?
то что вы там накидаете поинткатов перед после или вместо, вопроса не решает, так как реально метод не меняется !
уж лучше ASM бы посоветовали, хотя и там есть свои тонкости
1
 Аватар для 646kapeh064
59 / 58 / 16
Регистрация: 09.12.2013
Сообщений: 208
15.12.2013, 20:47  [ТС]
Цитата Сообщение от mutagen Посмотреть сообщение
уж лучше ASM
Я как-то давно гуглил, что-то про asm-3.3.1.jar и asm-tree-3.3.1.jar всплывало, это не оно?
Тогда так и не удалось справиться с проблемой, вот решил опять попытаться.
0
510 / 272 / 60
Регистрация: 14.12.2010
Сообщений: 548
15.12.2013, 22:41
Цитата Сообщение от mutagen Посмотреть сообщение
EVP, зачем же направлять человека в неправильном направлении ?
где в АОП есть изменение метода на лету?
то что вы там накидаете поинткатов перед после или вместо, вопроса не решает, так как реально метод не меняется !
уж лучше ASM бы посоветовали, хотя и там есть свои тонкости
Реализация ОАП в Spring позволяет создавать прокси для перехвата выполнения методов.
Только для этого нужны IoC и DI. Но это же мелочь

Изменять произвольный байткод библиотеки на лету?
Сложность обработки выше, чем переписать или полностью отказаться от внешней библиотеки целиком..разумеется, на мой взгляд.
1
 Аватар для 646kapeh064
59 / 58 / 16
Регистрация: 09.12.2013
Сообщений: 208
15.12.2013, 23:09  [ТС]
Цитата Сообщение от EVP Посмотреть сообщение
Изменять произвольный байткод библиотеки на лету?
Желательно просто перехват ) Все-таки изменять нет смысла.
Просто надо другой механизм в функции библиотеки реализовать.

Пойду разбираться ) Спасибо всем
0
 Аватар для 646kapeh064
59 / 58 / 16
Регистрация: 09.12.2013
Сообщений: 208
19.12.2013, 12:39  [ТС]
Что-то нашел по java asm. Вот что получилось:

Файл MANIFEST.MF
Java
1
2
3
Manifest-Version: 1.0
Main-Class: ru.main.mmm
Premain-Class: ru.main.premmm
Файл premmm.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class premmm implements ClassFileTransformer {
 
    public static void premain(String agentArgs, Instrumentation inst) {
        JOptionPane.showMessageDialog(null, "Welcome!!!");
        inst.addTransformer(new premmm());
    }
 
    public static void MyAlertBox(String s) {
        JOptionPane.showMessageDialog(null, s);
    }
 
    public byte[] transform(ClassLoader loader, String className,
                            Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
                            byte[] classfileBuffer) throws IllegalClassFormatException {
        byte[] retVal = null;
        if (className.startsWith("ru/test/N")) {
            ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
            ClassAdapter ca = new ClassAdapter(cw) {
                @Override
                public MethodVisitor visitMethod(final int access,
                                                 final String name,
                                                 final String desc,
                                                 String signature,
                                                 String[] exceptions) {
                    if (name.equals("l")) {
                        return new MethodAdapter(super.visitMethod(access, name, desc, signature, exceptions)) {
                            @Override
                            public void visitCode() {
                                mv.visitVarInsn(Opcodes.ALOAD, 0); // аргумент для моего AlertBox'а
                                mv.visitMethodInsn(Opcodes.INVOKESTATIC, "ru/main/premmm", "MyAlertBox", "(Ljava/lang/String;)V"); // вызов моего AlertBox
                                mv.visitInsn(Opcodes.RETURN); // выход из функции
                                mv.visitEnd();
                            }
                        };
                    }
                    return super.visitMethod(access, name, desc, signature, exceptions);
                }
            };
            ClassReader cr = new ClassReader(classfileBuffer);
            cr.accept(ca, 0);
            retVal = cw.toByteArray();
        }
        return retVal;
    }
    
}
В итоге функция ru/test/N.l меняется и выводит сообщение с переданной в неё строку (aload_0).
Это не совсем то, что хотелось, и это наверняка не самое лучшее решение для этого примера. Но может кому-то пригодится хоть какая-то инфа )
0
 Аватар для KuKu
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
19.12.2013, 21:14
У spring есть Method Replacement вроде как раз для этого случая.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.12.2013, 21:14
Помогаю со студенческими работами здесь

Compile-time и run-time методы и функции
Добрый день. Есть две функции, которые делают идентичную работу: template&lt;bool leftShift, typename T&gt; T byteShift(T data) { ...

При отладке кода появляется исключение 282 Run-time 282 No foreign application responded a DDE initiate
Я новичок в этом деле не могли бы вы что нибудь подсказать и указывает на строку кода Text1.LinkMode = MANUAL 'Establish a manual...

Run-time error
Всем здарсте. Подскажите пожалуйста: почему в результате работы такого кода, получаеться run-time ошибка ? #include...

Run-time error 9'
Помогите, пожалуйста, разобраться с ошибкой. Как сделать так, что бы в разных массивах (с разной размерностью и, соответственно, разными...

Run time error
Помогите, при пустом input.txt выдает run time error... var a,b,c,d:integer; begin assign(input, 'input.txt'); reset(input); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru