List of usage examples for org.objectweb.asm.commons ClassRemapper ClassRemapper
public ClassRemapper(final ClassVisitor classVisitor, final Remapper remapper)
From source file:com.github.jasmo.util.BytecodeHelper.java
License:Open Source License
public static void applyMappings(Map<String, ClassNode> classMap, Map<String, String> remap) { log.debug("Applying mappings ["); for (Map.Entry<String, String> entry : remap.entrySet()) { String k = entry.getKey(); String v = entry.getValue(); if (k.equals(v)) continue; // skip members with same name // field format = [ "<owner>.<name>" : "<newname>" ] // method format = [ "<owner>.<name> <desc>" : "<newname>" ] int n = k.indexOf('.'); if (n != -1 && v.length() >= n && v.substring(n).equals(k)) { continue; }// w ww. j a va 2s . co m log.debug(" Map {} to {}", entry.getKey(), entry.getValue()); } log.debug("]"); SimpleRemapper remapper = new SimpleRemapper(remap); for (ClassNode node : new ArrayList<>(classMap.values())) { ClassNode copy = new ClassNode(); ClassRemapper adapter = new ClassRemapper(copy, remapper); node.accept(adapter); classMap.put(node.name, copy); } }
From source file:com.navercorp.pinpoint.profiler.instrument.lambda.LambdaFactoryTest.java
License:Apache License
private void renameClass(ClassReader reader, ClassVisitor classVisitor) { String className = "com/navercorp/pinpoint/profiler/instrument/lambda/mock/UnsafeClassMock"; Remapper remapper = new SimpleRemapper(className, className + "2"); ClassRemapper classRemapper = new ClassRemapper(classVisitor, remapper); reader.accept(classRemapper, 0);/*from ww w . j a v a2 s.c o m*/ }
From source file:io.druid.query.topn.PooledTopNAlgorithm.java
License:Apache License
private static <T> T makeNewPooledTopNScanner(Class<? extends T> prototypeClass, Class<? extends Offset> specializingOffsetClass) { if (dontCopyClass) { try {/*from w w w . ja va 2 s. c o m*/ return prototypeClass.newInstance(); } catch (InstantiationException | IllegalAccessException e) { throw new RuntimeException(e); } } ClassLoader cl = prototypeClass.getClassLoader(); String prototypeClassName = prototypeClass.getName(); String prototypeClassBytecodeName = prototypeClassName.replace('.', '/'); String specializedClassName = prototypeClassName + "$Copy" + specializedClassCounter.getAndIncrement(); ClassWriter specializedClassWriter = new ClassWriter(0); HashMap<String, String> remapping = new HashMap<>(); remapping.put(prototypeClassBytecodeName, specializedClassName.replace('.', '/')); if (specializingOffsetClass != null) { remapping.put(Offset.class.getName().replace('.', '/'), specializingOffsetClass.getName().replace('.', '/')); } ClassVisitor classTransformer = new ClassRemapper(specializedClassWriter, new SimpleRemapper(remapping)); String prototypeClassResource = prototypeClassBytecodeName + ".class"; try (InputStream prototypeClassBytecodeStream = cl.getResourceAsStream(prototypeClassResource)) { ClassReader prototypeClassReader = new ClassReader(prototypeClassBytecodeStream); prototypeClassReader.accept(classTransformer, 0); byte[] specializedClassBytecode = specializedClassWriter.toByteArray(); Class specializedClass = UNSAFE.defineClass(specializedClassName, specializedClassBytecode, 0, specializedClassBytecode.length, cl, prototypeClass.getProtectionDomain()); return (T) specializedClass.newInstance(); } catch (InstantiationException | IllegalAccessException | IOException e) { throw new RuntimeException(e); } }
From source file:net.fabricmc.tinyremapper.TinyRemapper.java
License:Open Source License
private byte[] apply(final RClass cls) { ClassReader reader = new ClassReader(cls.data); ClassWriter writer = new ClassWriter(0); int flags = removeFrames ? ClassReader.SKIP_FRAMES : ClassReader.EXPAND_FRAMES; reader.accept(new ClassRemapper(check ? new CheckClassAdapter(writer) : writer, remapper), flags); // TODO: compute frames (-Xverify:all -XX:-FailOverToOldVerifier) return writer.toByteArray(); }
From source file:org.bdgenomics.adam.shade.ParquetAvroWorkaroundShader.java
License:Apache License
private void addRemappedClass(RelocatorRemapper remapper, JarOutputStream jos, File jar, String name, InputStream is) throws IOException, MojoExecutionException { if (!remapper.hasRelocators()) { try {/*from w w w .j av a 2s .co m*/ jos.putNextEntry(new JarEntry(name)); IOUtil.copy(is, jos); } catch (ZipException e) { getLogger().debug("We have a duplicate " + name + " in " + jar); } return; } ClassReader cr = new ClassReader(is); // We don't pass the ClassReader here. This forces the ClassWriter to rebuild the constant pool. // Copying the original constant pool should be avoided because it would keep references // to the original class names. This is not a problem at runtime (because these entries in the // constant pool are never used), but confuses some tools such as Felix' maven-bundle-plugin // that use the constant pool to determine the dependencies of a class. ClassWriter cw = new ClassWriter(0); final String pkg = name.substring(0, name.lastIndexOf('/') + 1); ClassVisitor cv = new ClassRemapper(cw, remapper) { @Override public void visitSource(final String source, final String debug) { if (source == null) { super.visitSource(source, debug); } else { final String fqSource = pkg + source; final String mappedSource = remapper.map(fqSource); final String filename = mappedSource.substring(mappedSource.lastIndexOf('/') + 1); super.visitSource(filename, debug); } } }; try { cr.accept(cv, ClassReader.EXPAND_FRAMES); } catch (Throwable ise) { throw new MojoExecutionException("Error in ASM processing class " + name, ise); } byte[] renamedClass = cw.toByteArray(); // Need to take the .class off for remapping evaluation String mappedName = remapper.map(name.substring(0, name.indexOf('.'))); try { // Now we put it back on so the class file is written out with the right extension. jos.putNextEntry(new JarEntry(mappedName + ".class")); IOUtil.copy(renamedClass, jos); } catch (ZipException e) { getLogger().debug("We have a duplicate " + mappedName + " in " + jar); } }
From source file:org.glowroot.agent.weaving.PluginClassRenamer.java
License:Apache License
private LazyDefinedClass build(String internalName, byte[] origBytes) throws IOException { processed.add(internalName);/* w w w.j a v a 2 s. co m*/ PluginClassRemapper remapper = new PluginClassRemapper(); ImmutableLazyDefinedClass.Builder builder = ImmutableLazyDefinedClass.builder() .type(Type.getObjectType(remapper.mapType(internalName))); ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); ClassVisitor cv = new ClassRemapper(cw, remapper); ClassReader cr = new ClassReader(origBytes); cr.accept(cv, 0); builder.bytes(cw.toByteArray()); for (String unprocessed : remapper.unprocessed) { builder.addDependencies(build(unprocessed)); } return builder.build(); }
From source file:org.gradle.ShadedJar.java
License:Apache License
private void analyse(FileCollection sourceFiles, final ClassGraph classes, final PrintWriter writer) { final PackagePatterns ignored = new PackagePatterns(Collections.singleton("java")); sourceFiles.getAsFileTree().visit(new FileVisitor() { boolean seenManifest; public void visitDir(FileVisitDetails dirDetails) { }// w w w . j a v a2 s . com public void visitFile(FileVisitDetails fileDetails) { writer.print(fileDetails.getPath() + ": "); if (fileDetails.getPath().endsWith(".class")) { try { ClassReader reader; InputStream inputStream = new BufferedInputStream(fileDetails.open()); try { reader = new ClassReader(inputStream); } finally { inputStream.close(); } final ClassDetails details = classes.get(reader.getClassName()); details.visited = true; ClassWriter classWriter = new ClassWriter(0); reader.accept(new ClassRemapper(classWriter, new Remapper() { public String map(String name) { if (ignored.matches(name)) { return name; } ClassDetails dependencyDetails = classes.get(name); if (dependencyDetails != details) { details.dependencies.add(dependencyDetails); } return dependencyDetails.outputClassName; } }), ClassReader.EXPAND_FRAMES); writer.println("mapped class name: " + details.outputClassName); File outputFile = new File(classesDir, details.outputClassName.concat(".class")); outputFile.getParentFile().mkdirs(); OutputStream outputStream = new FileOutputStream(outputFile); try { outputStream.write(classWriter.toByteArray()); } finally { outputStream.close(); } } catch (Exception exception) { throw new ClassAnalysisException("Could not transform class from " + fileDetails.getFile(), exception); } } else if (fileDetails.getPath().endsWith(".properties") && classes.unshadedPackages.matches(fileDetails.getPath())) { writer.println("include"); classes.addResource(new ResourceDetails(fileDetails.getPath(), fileDetails.getFile())); } else if (fileDetails.getPath().equals(JarFile.MANIFEST_NAME) && !seenManifest) { seenManifest = true; classes.manifest = new ResourceDetails(fileDetails.getPath(), fileDetails.getFile()); } else { writer.println("skipped"); } } }); }
From source file:org.gradle.ShadedJarCreator.java
License:Apache License
private void visitClassDirectory(final Path dir, final ClassGraph classes, final PackagePatterns ignored, final PrintWriter writer) throws IOException { Files.walkFileTree(dir, new FileVisitor<Path>() { boolean seenManifest; @Override/* w ww . j a v a2 s . c o m*/ public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { writer.print(file.getFileName().toString() + ": "); if (file.toString().endsWith(".class")) { try { ClassReader reader; try (InputStream inputStream = Files.newInputStream(file)) { reader = new ClassReader(inputStream); } final ClassDetails details = classes.get(reader.getClassName()); details.visited = true; ClassWriter classWriter = new ClassWriter(0); reader.accept(new ClassRemapper(classWriter, new Remapper() { public String map(String name) { if (ignored.matches(name)) { return name; } ClassDetails dependencyDetails = classes.get(name); if (dependencyDetails != details) { details.dependencies.add(dependencyDetails); } return dependencyDetails.outputClassName; } }), ClassReader.EXPAND_FRAMES); writer.println("mapped class name: " + details.outputClassName); File outputFile = new File(classesDir, details.outputClassName.concat(".class")); outputFile.getParentFile().mkdirs(); try (OutputStream outputStream = new FileOutputStream(outputFile)) { outputStream.write(classWriter.toByteArray()); } } catch (Exception exception) { throw new ClassAnalysisException("Could not transform class from " + file.toFile(), exception); } } else if (file.toString().endsWith(".properties") && classes.unshadedPackages.matches(file.toString())) { writer.println("include"); classes.addResource(new ResourceDetails(file.toString(), file.toFile())); } else if (file.toString().equals(JarFile.MANIFEST_NAME) && !seenManifest) { seenManifest = true; classes.manifest = new ResourceDetails(file.toString(), file.toFile()); } else { writer.println("skipped"); } return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { return FileVisitResult.TERMINATE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { return FileVisitResult.CONTINUE; } }); }
From source file:org.spongepowered.server.launch.transformer.deobf.DeobfuscationTransformer.java
License:MIT License
ClassVisitor createClassRemapper(ClassReader reader, ClassVisitor cv) {
return new ClassRemapper(cv, this);
}
From source file:org.wildfly.swarm.jaxrs.runtime.DefaultApplicationFactory.java
License:Apache License
public static byte[] create(String name, String path) throws IOException { ClassReader reader = new ClassReader(basicClassBytes()); String slashName = name.replace('.', '/'); ClassWriter writer = new ClassWriter(0); Remapper remapper = new Remapper() { @Override//from w w w .ja va 2 s . c o m public String map(String typeName) { if (typeName.equals("org/wildfly/swarm/jaxrs/runtime/DefaultApplication")) { return slashName; } return super.map(typeName); } }; ClassRemapper adapter = new ClassRemapper(writer, remapper); reader.accept(adapter, 0); AnnotationVisitor ann = writer.visitAnnotation("Ljavax/ws/rs/ApplicationPath;", true); ann.visit("value", path); ann.visitEnd(); writer.visitEnd(); return writer.toByteArray(); }