001 package org.shiftone.jrat.jvmti; 002 003 004 import org.shiftone.jrat.core.ServiceFactory; 005 import org.shiftone.jrat.inject.InjectorOptions; 006 import org.shiftone.jrat.inject.bytecode.Transformer; 007 import org.shiftone.jrat.util.log.Logger; 008 009 import java.lang.instrument.ClassFileTransformer; 010 import java.lang.instrument.IllegalClassFormatException; 011 import java.security.ProtectionDomain; 012 013 014 public class InjectClassFileTransformer implements ClassFileTransformer { 015 016 private static final Logger LOG = Logger.getLogger(InjectClassFileTransformer.class); 017 private ServiceFactory serviceFactory = ServiceFactory.getInstance(); 018 private Transformer transformer = serviceFactory.getTransformer(); 019 private InjectorOptions injectorOptions; 020 021 public InjectClassFileTransformer(InjectorOptions injectorOptions) throws Exception { 022 023 LOG.info("new"); 024 025 this.injectorOptions = injectorOptions; 026 } 027 028 029 public byte[] transform( 030 ClassLoader loader, 031 String className, 032 Class /* <?> */ classBeingRedefined, 033 ProtectionDomain protectionDomain, 034 byte[] inClassfileBuffer) 035 throws IllegalClassFormatException { 036 037 if ((loader == null) 038 || (loader.getParent() == null) 039 || className.startsWith("org/shiftone/jrat") 040 || className.startsWith("sun") 041 || className.startsWith("javax")) { 042 043 // LOG.debug("skipping class : " + className); 044 return inClassfileBuffer; 045 } 046 047 return transformer.inject(inClassfileBuffer, injectorOptions); 048 049 } 050 051 052 public String toString() { 053 return "InjectClassFileTransformer[" + transformer + "]"; 054 } 055 }