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
820
Spec-Driven Development with AI Agents (Workshop, May 2026)
antonarhipov
4
610
Spec-Driven Development with AI Agents. Java Day Istanbul 2026
antonarhipov
3
170
Spec-Driven Development with AI Agents: From High-Level Requirements to Working Software
antonarhipov
3
200
Strengthening Immutability in Kotlin. A Glimpse into Valhalla
antonarhipov
3
130
Kotlin—the New and Noteworthy in 2.2
antonarhipov
1
64
Levels of AI-assisted programming
antonarhipov
0
200
Devoxx France 2024. Kotlin - the new and noteworthy
antonarhipov
3
140
Harnessing the power of AI in IntelliJ IDEA
antonarhipov
1
280
Other Decks in Programming
See All in Programming
[JA] Domain Modeling with Vanilla Rails: 「操作」から再考するRailsの設計論
yasaichi
2
380
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
240
ChromeでローカルLLM
ryu1013
0
140
Event is what happens
moro
2
850
golang-bob.pdf
iwatsukayura
0
130
Atomic Design, Enforced: Scaling Mobile Design Systems (next.app devCon / droidCon Berlin 2026)
steliosf
PRO
0
170
npm との違いを手がかりにGo の依存管理を理解したい
optim
0
600
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
430
R8 の設定見直しでアプリサイズ削減
andpad
0
220
コーディング自動化の次へ。人の介入をゼロにするファクトリーとサポートAIによる実践
timakin
5
3.8k
dotNET_vulnclicker_intro.pdf
deka_morita
0
140
外から家のPCの電源入れたい!をPHPで解決する
kawashimo0
1
140
Featured
See All Featured
Color Theory Basics | Prateek | Gurzu
gurzu
1
490
The Invisible Side of Design
smashingmag
301
52k
Designing for humans not robots
tammielis
254
26k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
Faster Mobile Websites
deanohume
310
32k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
260
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
77k
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