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
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
650
Spec-Driven Development with AI Agents (Workshop, May 2026)
antonarhipov
4
570
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
180
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
XHTMLが残したもの
yosuke_furukawa
PRO
1
410
XP祭りでしか伝わらないフリップネタ #xpjug
murabayashi
0
110
業務時間外もAIに働いてもらう話
colorful12
3
10k
AIの中の人になってみる
htkym
0
170
kubernetes コンポーネント開発入門 / 新卒N年目の勉強会&交流会!〜〇〇への誘い〜 #n_study
mazrean
0
160
AIと壁打ちしながら進めるコスト管理
fufuhu
2
1.9k
Swift愛好会と私(ウホーイ) / Swift Fan Club and Uhooi
uhooi
0
140
AWS DevOps Agentで インシデント対応をAIに任せたい
honmarkhunt
6
2.4k
The Good Stuff, Not the Slop: Engineering High-Quality Android Apps with Modern AI Tooling
danybony
1
190
私のClaude Code活用法 (個人開発編) - PHPerKaigi mini #4(2026/08/24)
panda_program
1
210
LLMは4年分のCompose移行を再現できるのか?実プロダクト279件のXMLで探る自動化の境界線
makun
0
430
高専、大学編入、そして未踏へ〜プロダクト開発とキャリアの歩み - Technical College, University Transfer, and On to “Mitou” / My Journey in Product Development and Career
pkmiya
0
140
Featured
See All Featured
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6.1k
Optimising Largest Contentful Paint
csswizardry
37
3.9k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Believing is Seeing
oripsolob
1
210
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
510
Designing Experiences People Love
moore
143
24k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
890
Building Flexible Design Systems
yeseniaperezcruz
330
41k
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
Producing Creativity
orderedlist
PRO
348
41k
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