public Object run() { // define a package if necessary. int i= classname.lastIndexOf('.'); if (i > 0) { String packageName= classname.substring(0, i); Package pkg= getPackage(packageName); if (pkg == null) { definePackage(packageName, null, null, null, null, null, null, null); } } byte[] newData; if (bytecodeTransformer == null || !bytecodeTransformer.requiresTransformation(classname) || loadingClass.contains(classname)) newData= classData; else { loadingClass.add(classname); Thread.currentThread().setContextClassLoader(last); newData= bytecodeTransformer.transform(classname, classData); Thread.currentThread().setContextClassLoader(DragomeInstrumentationClassLoader.this); } ProtectionDomain domain= this.getClass().getProtectionDomain(); return defineClass(classname, newData, 0, newData.length, domain); } }, acc);
public byte[] transform(String className, byte[] bytecode) { byte[] transformedBytecode= bytecode; for (InstrumentationDragomeConfigurator configurator : configurators) if (configurator.isEnabled()) transformedBytecode= configurator.getBytecodeTransformer().transform(className, transformedBytecode); return transformedBytecode; }
public Parser(ClassUnit theFileUnit) { fileUnit= theFileUnit; fileUnit.annotations= null; AttributeReader r= new AnnotationReader(fileUnit); Attribute.addAttributeReader("RuntimeVisibleAnnotations", r); try { InputStream openInputStream= fileUnit.getClassFile().openInputStream(); String filename= fileUnit.getName(); byte[] originalByteArray= IOUtils.toByteArray(openInputStream); byte[] transformedArray= originalByteArray; transformedArray= lambdaUsageBackporter.transform(filename, transformedArray); if (DragomeJsCompiler.compiler.bytecodeTransformer != null) if (DragomeJsCompiler.compiler.bytecodeTransformer.requiresTransformation(filename)) transformedArray= DragomeJsCompiler.compiler.bytecodeTransformer.transform(filename, transformedArray); fileUnit.setBytecodeArrayI(transformedArray); ClassParser cp= new ClassParser(new ByteArrayInputStream(transformedArray), filename); jc= cp.parse(); } catch (IOException e) { throw new RuntimeException(e); } } public TypeDeclaration parse()