Я видел прокси -часть Hibernate за последние два дня. Первой реакцией было то, что основной слой использовал отражение и сгенерировал класс прокси для объекта пользователя. Позже я понял, что отражение не имеет возможности генерировать новые классы, поэтому я, естественно, нашел Javassist (адрес загрузки).
Большинство учебных пособий, найденных в Интернете, объясняются Javassist API, но, в конце концов, часто нет процесса загрузки. Когда автор подражает этим учебным пособиям для загрузки класса, загруженными результатами являются исходный класс и отсутствие контента с модифицированным байт -кодом.
После некоторого исследования автор обнаружил, что последний шаг в большинстве учебных пособий в Интернете, для сохранения байт -кода используется сохранение байт -кода. После проверки своей структуры функции он обнаружил, что он также имеет перегрузку типа строки. Поскольку в рамках затмения корневое положение байткода не является ".//" ", но" ./bin ", а другая перегрузка файла записи, вероятно, будет параметром, указывающим корневое положение байт -кода. После некоторых изменений я обнаружил, что это было правдой.
Ниже приведен демо -код:
Это структура проекта автора:
Reditable.java: пакет com.trblock.javassist; открытый класс редактируемый {public void showinfo () {System.out.println ("Infodefault!"); }} Main.java: пакет com.trblock.javassist; import java.io.ioexception; импорт javassist.cannotcompileexception; import javassist.classpool; импорт javassist.ctclass; import javassist.ctmethod; import javassist.ctnewmethod; import javassist.notfoundexception; public mainexcept {public stricexceptex; public klessexceptex; public steclexceptex; public klessexceptex; args) {classpool pool = classpool.getdefault (); try {pool.insertclasspath (".// bin"); // Установить путь к корне. (Установка корневого пути, очевидно, не используется с помощью записи) ctclass cc = pool.makeclass ("com.trblock.javassist.editablechanged"); // Смоделировать режим Hibernate Proxy, мы создаем новый класс cc.setsuperclass (pool.get ("com.trblock.javassist.edable"); Ctnewmethod.make ("public void showinfo () {super.showinfo (); system.out.println (/" custominserthaha!/");}", Cc); // Добавить метод, обратите внимание, что он переопределяет методы в родительском классе. cc.addmethod (cm); cc.writefile (".// bin"); // Это более важно. Результатом нулевого параметра является то, что он не сохраняется в пути корня eclipse Bytecode. } catch (notFoundException | не concompileException | ioException e) {e.printstacktrace ();} try {class <?> cl = class.forname ("com.thrblock.javassist.editablechanged"); // Нагрузка нашего нового класса редактируемого = (редактируемое) cl.newinStance ();////или нагрузка на нагрузку, как и нагрузка на нагрузку. С зимний. ed.showinfo (); // вызов метода. } catch (classnotfoundexception | instantiationException | allogalaccessexception e) {e.printstacktrace ();}}}Результат печати:
Infodefault!
Custominserthaha!
Другие примечания:
Поскольку мы сгенерировали класс, если имя класса такое же, как исходное имя класса, файл класса будет перезаписан. Однако, если класс был загружен JVM до модификации, модифицированная часть не вступит в силу, а JVM должен быть перезапущен.
Суммировать
Выше приведено все содержание этой статьи о правильном методе использования джавасиста под Eclipse. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!