38
Javassist НА СЛУЖБЕ У JAVA-РАЗРАБОТЧИКА JPoint 2015

JPoint 2015 - Javassist на службе Java-разработчика

Embed Size (px)

Citation preview

Page 1: JPoint 2015 - Javassist на службе Java-разработчика

JavassistНА СЛУЖБЕ У JAVA-РАЗРАБОТЧИКА

JPoint 2015

Page 2: JPoint 2015 - Javassist на службе Java-разработчика

Привет!

Антон Архипов @antonarhipov

Page 3: JPoint 2015 - Javassist на службе Java-разработчика

Что общего у этих фреймворков?

Page 4: JPoint 2015 - Javassist на службе Java-разработчика
Page 5: JPoint 2015 - Javassist на службе Java-разработчика

@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;  

Page 6: JPoint 2015 - Javassist на службе Java-разработчика

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;  

Page 7: JPoint 2015 - Javassist на службе Java-разработчика

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!

Page 8: JPoint 2015 - Javassist на службе Java-разработчика

Основное применение байткодо-генерирующих

библиотек в Java-фреймворках - это генерация proxy.

Page 9: JPoint 2015 - Javassist на службе Java-разработчика

Давайте лучше патчить чужой код! :)

Page 10: JPoint 2015 - Javassist на службе Java-разработчика
Page 11: JPoint 2015 - Javassist на службе Java-разработчика

инструментация байткода?

Page 12: JPoint 2015 - Javassist на службе Java-разработчика

инструментация байткода?

легко! бери Javassist!

Page 13: JPoint 2015 - Javassist на службе Java-разработчика

План захвата галактики

Javassist-javaagentбазовые основы

немного о JRebel

… и попробуем со всем этим хламом взлететь

Page 14: JPoint 2015 - Javassist на службе Java-разработчика

Javassistwww.javassist.org

Page 15: JPoint 2015 - Javassist на службе Java-разработчика

CtPool

CtClass

CtClass

CtClass

CtClass

CtField

CtMethod

CtConst

CtMethod

insertBefore

insertAfter

instrument

Page 16: JPoint 2015 - Javassist на службе Java-разработчика

https://github.com/antonarhipov/jpoint

Page 17: JPoint 2015 - Javassist на службе Java-разработчика

Жаба-Агент

Page 18: JPoint 2015 - Javassist на службе Java-разработчика

Java Agentimport 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

Page 19: JPoint 2015 - Javassist на службе Java-разработчика

ClassFileTransformernew 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(); } }

Page 20: JPoint 2015 - Javassist на службе Java-разработчика

ClassFileTransformernew 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(); } }

Page 21: JPoint 2015 - Javassist на службе Java-разработчика

ClassFileTransformernew 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(); } }

Page 22: JPoint 2015 - Javassist на службе Java-разработчика

ClassFileTransformernew 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(); } }

Page 23: JPoint 2015 - Javassist на службе Java-разработчика
Page 24: JPoint 2015 - Javassist на службе Java-разработчика
Page 25: JPoint 2015 - Javassist на службе Java-разработчика
Page 26: JPoint 2015 - Javassist на службе Java-разработчика
Page 27: JPoint 2015 - Javassist на службе Java-разработчика
Page 28: JPoint 2015 - Javassist на службе Java-разработчика

https://github.com/zeroturnaround/callspy

Page 29: JPoint 2015 - Javassist на службе Java-разработчика

Javassist в

Page 30: JPoint 2015 - Javassist на службе Java-разработчика

JRebel core

Spring plugin

Hibernate plugin

EJB plugin

Page 31: JPoint 2015 - Javassist на службе Java-разработчика

JRebel core

Spring plugin

Hibernate plugin

EJB plugin

Перегрузка классов

Page 32: JPoint 2015 - Javassist на службе Java-разработчика

JRebel core

Spring plugin

Hibernate plugin

EJB pluginОповещение

Page 33: JPoint 2015 - Javassist на службе Java-разработчика

JRebel core

Spring plugin

Hibernate plugin

EJB plugin

Обновить конфигурацию

Page 34: JPoint 2015 - Javassist на службе Java-разработчика

JRebel core

Spring plugin

Hibernate plugin

EJB plugin

Здесь живёт Javassist

Page 35: JPoint 2015 - Javassist на службе Java-разработчика

JRebel core

Spring plugin

Hibernate plugin

EJB plugin

Spring

Hibernate

OpenEJB

Page 36: JPoint 2015 - Javassist на службе Java-разработчика

https://github.com/antonarhipov/jpoint

Page 37: JPoint 2015 - Javassist на службе Java-разработчика

Задача

Javassist

Page 38: JPoint 2015 - Javassist на службе Java-разработчика

@antonarhipov [email protected]://speakerdeck.com/antonarhipov

http://www.slideshare.net/arhan