Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
JPoint 2015 - Javassist на службе у Java-разраб...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
590
Spec-Driven Development with AI Agents (Workshop, May 2026)
antonarhipov
4
520
Spec-Driven Development with AI Agents. Java Day Istanbul 2026
antonarhipov
3
140
Spec-Driven Development with AI Agents: From High-Level Requirements to Working Software
antonarhipov
3
150
Strengthening Immutability in Kotlin. A Glimpse into Valhalla
antonarhipov
3
110
Kotlin—the New and Noteworthy in 2.2
antonarhipov
1
50
Levels of AI-assisted programming
antonarhipov
0
160
Devoxx France 2024. Kotlin - the new and noteworthy
antonarhipov
2
110
Harnessing the power of AI in IntelliJ IDEA
antonarhipov
1
260
Other Decks in Programming
See All in Programming
言語を使う側から、作る側へ。 自作 Lisp で得た新たな気づき。
andpad
0
130
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
150
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
190
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
160
信頼性について考えてみる(SRE NEXT 2026 miniLT)
hayama17
0
210
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
150
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
170
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
1
220
地域 SRE コミュニティ最前線 - ホンマでっかSRE勉強会
tk3fftk
0
270
Prismを使った型安全な暗号化_関数型まつり2026
_fhhmm
0
150
共通化で考えるべきは、実装より公開する型だった
codeegg
0
280
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
180
Featured
See All Featured
Context Engineering - Making Every Token Count
addyosmani
9
1k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
A Tale of Four Properties
chriscoyier
163
24k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
270
Everyday Curiosity
cassininazir
0
260
Balancing Empowerment & Direction
lara
6
1.2k
Bash Introduction
62gerente
615
220k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
72
40k
Become a Pro
speakerdeck
PRO
31
6k
KATA
mclloyd
PRO
35
15k
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