Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
JPoint 2015 - Javassist на службе у Java-разраб...
Search
Anton Arhipov
April 20, 2015
Programming
200
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
JPoint 2015 - Javassist на службе у Java-разработчика
Anton Arhipov
April 20, 2015
More Decks by Anton Arhipov
See All by Anton Arhipov
Spec-Driven Development with AI-Agents: From High-Level Requirements to Working Software
antonarhipov
2
660
Spec-Driven Development with AI Agents (Workshop, May 2026)
antonarhipov
4
580
Spec-Driven Development with AI Agents. Java Day Istanbul 2026
antonarhipov
3
150
Spec-Driven Development with AI Agents: From High-Level Requirements to Working Software
antonarhipov
3
190
Strengthening Immutability in Kotlin. A Glimpse into Valhalla
antonarhipov
3
120
Kotlin—the New and Noteworthy in 2.2
antonarhipov
1
58
Levels of AI-assisted programming
antonarhipov
0
180
Devoxx France 2024. Kotlin - the new and noteworthy
antonarhipov
2
120
Harnessing the power of AI in IntelliJ IDEA
antonarhipov
1
270
Other Decks in Programming
See All in Programming
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
3
490
型解析で実現する Go の言語内 DSL / Conference に Go! タイムテーブルの歩き方 for Gophers
mazrean
0
140
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
230
自分的「カンファレンスの楽しみ方」
syumai
0
200
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
110
Swift愛好会100回記念 第1回を振り返る
jollyjoester
0
120
PHPプロジェクトの結合バランスを可視化する #php_night
kajitack
0
230
[DroidKaigi 2026] Bring your own phones to Gradle Managed Devices
f2lk
0
110
AI × TiDD / 2026.09.05 Redmine 大阪
tokudiro
1
120
LLMは4年分のCompose移行を再現できるのか?実プロダクト279件のXMLで探る自動化の境界線
makun
0
530
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
6
1.8k
フロントエンドUIフレームワークのこれまでとこれから
ssssota
5
2.4k
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Building the Perfect Custom Keyboard
takai
2
870
Mind Mapping
helmedeiros
1
350
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Marketing to machines
jonoalderson
1
5.8k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
560
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
530
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
680
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
エンジニアに許された特別な時間の終わり
watany
108
250k
Transcript
Javassist НА СЛУЖБЕ У JAVA-РАЗРАБОТЧИКА JPoint 2015
Привет! Антон Архипов @antonarhipov
Что общего у этих фреймворков?
None
@Entity @Table(name = "owners") public class Owner extends Person {
@Column(name = "address") @NotEmpty private String address; @Column(name = "city") @NotEmpty private String city; @Column(name = "telephone") @NotEmpty @Digits(fraction = 0, integer = 10) private String telephone; @OneToMany(cascade = CascadeType.ALL, mappedBy = "owner") private Set<Pet> pets;
public class JavassistLazyInitializer
extends BasicLazyInitializer implements MethodHandler { final JavassistLazyInitializer instance = new JavassistLazyInitializer(…); ProxyFactory factory = new ProxyFactory(); factory.setSuperclass(interfaces.length == 1?persistentClass:null); factory.setInterfaces(interfaces); factory.setFilter(FINALIZE_FILTER); Class cl = factory.createClass(); final HibernateProxy proxy = (HibernateProxy) cl.newInstance(); ((ProxyObject)proxy).setHandler(instance); instance.constructed = true; return proxy;
public class JavassistLazyInitializer
extends BasicLazyInitializer implements MethodHandler { final JavassistLazyInitializer instance = new JavassistLazyInitializer(…); ProxyFactory factory = new ProxyFactory(); factory.setSuperclass(interfaces.length == 1?persistentClass:null); factory.setInterfaces(interfaces); factory.setFilter(FINALIZE_FILTER); Class cl = factory.createClass(); final HibernateProxy proxy = (HibernateProxy) cl.newInstance(); ((ProxyObject)proxy).setHandler(instance); instance.constructed = true; return proxy; генерируем proxy!
Основное применение байткодо-генерирующих библиотек в Java-фреймворках - это генерация proxy.
Давайте лучше патчить чужой код! :)
None
инструментация байткода?
инструментация байткода? легко! бери Javassist!
План захвата галактики Javassist -javaagent базовые основы немного о JRebel
… и попробуем со всем этим хламом взлететь
Javassist www.javassist.org
CtPool CtClass CtClass CtClass CtClass CtField CtMethod CtConst CtMethod insertBefore
insertAfter instrument
https://github.com/antonarhipov/jpoint
Жаба-Агент
Java Agent import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.Instrumentation; public class Agent {
public static void premain(String args, Instrumentation inst) throws Exception { inst.addTransformer(new ClassFileTransformer { // тут будет код }); } } META-INF/MANIFEST.MF Premain-Class: Agent $> java –javaagent:agent.jar application.Main
ClassFileTransformer new ClassFileTransformer() { public byte[] transform(ClassLoader loader, String className,
Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer){ ClassPool cp = ClassPool.getDefault(); CtClass ct = cp.makeClass(new ByteArrayInputStream(classfileBuffer)); // тут можно сделать с ct что душе угодно return ct.toBytecode(); } }
ClassFileTransformer new ClassFileTransformer() { public byte[] transform(ClassLoader loader, String className,
Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer){ ClassPool cp = ClassPool.getDefault(); CtClass ct = cp.makeClass(new ByteArrayInputStream(classfileBuffer)); // тут можно сделать с ct что душе угодно return ct.toBytecode(); } }
ClassFileTransformer new ClassFileTransformer() { public byte[] transform(ClassLoader loader, String className,
Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer){ ClassPool cp = ClassPool.getDefault(); CtClass ct = cp.makeClass(new ByteArrayInputStream(classfileBuffer)); // тут можно сделать с ct что душе угодно return ct.toBytecode(); } }
ClassFileTransformer new ClassFileTransformer() { public byte[] transform(ClassLoader loader, String className,
Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer){ ClassPool cp = ClassPool.getDefault(); CtClass ct = cp.makeClass(new ByteArrayInputStream(classfileBuffer)); // тут можно сделать с ct что душе угодно return ct.toBytecode(); } }
None
None
None
None
None
https://github.com/zeroturnaround/callspy
Javassist в
JRebel core Spring plugin Hibernate plugin EJB plugin
JRebel core Spring plugin Hibernate plugin EJB plugin Перегрузка классов
JRebel core Spring plugin Hibernate plugin EJB plugin Оповещение
JRebel core Spring plugin Hibernate plugin EJB plugin Обновить конфигурацию
JRebel core Spring plugin Hibernate plugin EJB plugin Здесь живёт
Javassist
JRebel core Spring plugin Hibernate plugin EJB plugin Spring Hibernate
OpenEJB
https://github.com/antonarhipov/jpoint
Задача Javassist
@antonarhipov
[email protected]
https://speakerdeck.com/antonarhipov http://www.slideshare.net/arhan