List of usage examples for org.objectweb.asm.commons SimpleRemapper SimpleRemapper
public SimpleRemapper(final Map<String, String> mapping)
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 w w . j a v a 2 s . c o 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.googlecode.ddom.weaver.mixin.MergeAdapter.java
License:Apache License
@Override public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {/*from w w w . j av a2 s. co m*/ finalName = name; Set<String> mergedInterfaces = new HashSet<String>(); mergedInterfaces.addAll(Arrays.asList(interfaces)); for (MixinInfo mixin : mixins) { mergedInterfaces.addAll(mixin.getContributedInterfaces()); } super.visit(version, access, name, signature, superName, mergedInterfaces.toArray(new String[mergedInterfaces.size()])); Map<String, String> mapping = new HashMap<String, String>(); for (MixinInfo mixin : mixins) { mapping.put(mixin.getName(), name); } remapper = new SimpleRemapper(mapping); }
From source file:com.licel.jcardsim.utils.JavaCardApiProcessor.java
License:Apache License
public static void proxyClass(File buildDir, String proxyClassFile, String targetClassFile, boolean skipConstructor) throws IOException { File proxyFile = new File(buildDir, proxyClassFile.replace(".", File.separator) + ".class"); FileInputStream fProxyClass = new FileInputStream(proxyFile); FileInputStream fTargetClass = new FileInputStream( new File(buildDir, targetClassFile.replace(".", File.separator) + ".class")); ClassReader crProxy = new ClassReader(fProxyClass); ClassNode cnProxy = new ClassNode(); crProxy.accept(cnProxy, 0);/* w w w . j a v a 2 s. c o m*/ ClassReader crTarget = new ClassReader(fTargetClass); ClassNode cnTarget = new ClassNode(); crTarget.accept(cnTarget, 0); ClassNode cnProxyRemapped = new ClassNode(); HashMap<String, String> map = new HashMap(); map.put(cnProxy.name, cnTarget.name); // inner classes for (int i = 0; i < 10; i++) { map.put(cnProxy.name + "$1", cnTarget.name + "$1"); } RemappingClassAdapter ra = new RemappingClassAdapter(cnProxyRemapped, new SimpleRemapper(map)); cnProxy.accept(ra); ClassWriter cw = new ClassWriter(crTarget, 0); MergeAdapter ma = new MergeAdapter(cw, cnProxyRemapped, skipConstructor); cnTarget.accept(ma); fProxyClass.close(); fTargetClass.close(); FileOutputStream fos = new FileOutputStream( new File(buildDir, targetClassFile.replace(".", File.separator) + ".class")); fos.write(cw.toByteArray()); fos.close(); // remove proxy class proxyFile.delete(); }
From source file:com.licel.jcardsim.utils.JavaCardApiProcessor.java
License:Apache License
public static void copyClass(File buildDir, String proxyClassFile, String targetClassName, Map map) throws IOException { File sourceFile = new File(buildDir, proxyClassFile.replace(".", File.separator) + ".class"); FileInputStream fProxyClass = new FileInputStream(sourceFile); ClassReader crProxy = new ClassReader(fProxyClass); ClassNode cnProxy = new ClassNode(); crProxy.accept(cnProxy, 0);/* www. j a v a 2 s . com*/ ClassWriter cw = new ClassWriter(0); map.put(cnProxy.name, targetClassName.replace(".", "/")); RemappingClassAdapter ra = new RemappingClassAdapter(cw, new SimpleRemapper(map)); cnProxy.accept(ra); fProxyClass.close(); FileOutputStream fos = new FileOutputStream( new File(buildDir, targetClassName.replace(".", File.separator) + ".class")); fos.write(cw.toByteArray()); fos.close(); // remove source class sourceFile.delete(); }
From source file:com.taobao.android.builder.tasks.app.databinding.DataBindingRenameTask.java
License:Apache License
/** * ?so/*from w w w . ja v a 2 s .c o m*/ */ @TaskAction void createAwbPackages() throws ExecutionException, InterruptedException { AndroidDependencyTree androidDependencyTree = AtlasBuildContext.androidDependencyTrees .get(getVariantName()); if (null == androidDependencyTree) { return; } ExecutorServicesHelper executorServicesHelper = new ExecutorServicesHelper(taskName, getLogger(), 0); List<Runnable> runnables = new ArrayList<>(); for (final AwbBundle awbBundle : androidDependencyTree.getAwbBundles()) { runnables.add(new Runnable() { @Override public void run() { try { File dataBindingClazzFolder = appVariantOutputContext.getVariantContext() .getJAwbavaOutputDir(awbBundle); String packageName = ManifestFileUtils.getPackage(awbBundle.getOrgManifestFile()); String appName = appVariantContext.getVariantConfiguration().getOriginalApplicationId(); //? File dataMapperClazz = new File(dataBindingClazzFolder, "android/databinding/DataBinderMapper.class"); if (!dataMapperClazz.exists()) { throw new GradleException("missing datamapper class"); } FileInputStream fileInputStream = new FileInputStream(dataMapperClazz); ClassReader in1 = new ClassReader(fileInputStream); ClassWriter cw = new ClassWriter(0); Map<String, String> reMapping = new HashedMap(); reMapping.put(appName.replace(".", "/") + "/BR", packageName.replace(".", "/") + "/BR"); RemappingClassAdapter remappingClassAdapter = new RemappingClassAdapter(cw, new SimpleRemapper(reMapping)); in1.accept(remappingClassAdapter, 8); ClassReader in2 = new ClassReader(cw.toByteArray()); ClassWriter cw2 = new ClassWriter(0); Set<String> renames = new HashSet<String>(); renames.add("android/databinding/DataBinderMapper"); in2.accept( new ClassRenamer(cw2, renames, packageName.replace(".", "/") + "/DataBinderMapper"), 8); File destClass = new File(dataBindingClazzFolder, packageName.replace(".", "/") + "/DataBinderMapper.class"); destClass.getParentFile().mkdirs(); FileOutputStream fileOutputStream = new FileOutputStream(destClass); fileOutputStream.write(cw2.toByteArray()); IOUtils.closeQuietly(fileOutputStream); IOUtils.closeQuietly(fileInputStream); FileUtils.deleteDirectory(new File(dataBindingClazzFolder, "android/databinding")); FileUtils.deleteDirectory(new File(dataBindingClazzFolder, "com/android/databinding")); File appDir = new File(dataBindingClazzFolder, appName.replace(".", "/")); if (appDir.exists()) { File[] files = appDir.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.isFile() && !pathname.isDirectory(); } }); for (File tmp : files) { FileUtils.forceDelete(tmp); } } } catch (Throwable e) { e.printStackTrace(); throw new GradleException("package awb failed"); } } }); } executorServicesHelper.execute(runnables); }
From source file:com.taobao.android.builder.tools.asm.ClazzReplacer.java
License:Apache License
@Override protected void handleClazz(JarFile jarFile, JarOutputStream jos, JarEntry ze, String pathName) { // logger.log(pathName); if (reMapping.containsKey(pathName.substring(0, pathName.length() - 6))) { logger.info("[ClazzReplacer] remove class " + pathName + " form " + jarFile); return;/*from www.j av a 2 s. c om*/ } try { InputStream in = jarFile.getInputStream(ze); ClassReader cr = new ClassReader(in); ClassWriter cw = new ClassWriter(0); RemappingClassAdapter remappingClassAdapter = new RemappingClassAdapter(cw, new SimpleRemapper(reMapping)); cr.accept(remappingClassAdapter, ClassReader.EXPAND_FRAMES); InputStream inputStream = new ByteArrayInputStream(cw.toByteArray()); copyStreamToJar(inputStream, jos, pathName, ze.getTime()); } catch (Throwable e) { System.err.println("[ClazzReplacer] rewrite error > " + pathName); justCopy(jarFile, jos, ze, pathName); } }
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 {// w w w .j a v a 2s .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:nl.hardijzer.fw.chainsrg.Method.java
License:Open Source License
public static Map<String, MappedClass> chain(Map<String, MappedClass> a, Map<String, MappedClass> b) { Map<String, String> aback = new TreeMap<String, String>(); Map<String, String> bforward = new TreeMap<String, String>(); for (String strFrom : a.keySet()) aback.put(a.get(strFrom).strNewName, strFrom); for (String strFrom : b.keySet()) bforward.put(strFrom, b.get(strFrom).strNewName); Remapper btoa = new SimpleRemapper(aback); Remapper btoc = new SimpleRemapper(bforward); Map<String, MappedClass> c = new TreeMap<String, MappedClass>(); for (String strFrom : a.keySet()) { MappedClass mappedA = a.get(strFrom); MappedClass mappedB = b.get(mappedA.strNewName); if (mappedB != null) { //Remove from b, so we know which ones we already had. b.remove(mappedA.strNewName); //Uh-oh, chaining here! MappedClass mappedC = new MappedClass(mappedB.strNewName); mappedC.mapFields = chainFields(mappedA.mapFields, mappedB.mapFields); mappedC.mapMethods = chainMethods(mappedA.mapMethods, mappedB.mapMethods, btoa, btoc); c.put(strFrom, mappedC);// ww w .jav a 2 s . c o m } else { //We're safe, no actual chaining c.put(strFrom, mappedA); } } //Add in the unchained ones from B for (String strFrom : b.keySet()) { c.put(strFrom, b.get(strFrom)); } return c; }
From source file:org.apache.commons.weaver.normalizer.Normalizer.java
License:Apache License
/** * Rewrite classes as indicated by one entry of {@link #segregate(Iterable)}. * @param key {@link String} {@link Pair} indicating supertype and constructor signature * @param toMerge matching classes//ww w . java2 s. c o m * @throws IOException on I/O error */ private void rewrite(final Pair<String, String> key, final Set<ClassWrapper> toMerge) throws IOException { final String target = copy(key, toMerge.iterator().next()); env.info("Merging %s identical %s implementations with constructor %s to type %s", toMerge.size(), key.getLeft(), key.getRight(), target); final Map<String, Map<String, ClassWrapper>> byEnclosingClass = byEnclosingClass(toMerge); for (final Map.Entry<String, Map<String, ClassWrapper>> entry : byEnclosingClass.entrySet()) { final String outer = entry.getKey(); env.debug("Normalizing %s inner classes of %s", entry.getValue().size(), outer); final Map<String, String> classMap = new HashMap<>(); for (final String merged : entry.getValue().keySet()) { classMap.put(merged, target); } final Remapper remapper = new SimpleRemapper(classMap); try (InputStream enclosingBytecode = env.getClassfile(outer).getInputStream()) { final ClassReader reader = new ClassReader(enclosingBytecode); reader.accept(new Remap(new WriteClass(reader), remapper, classMap, entry.getValue()), 0); } for (final String merged : entry.getValue().keySet()) { if (env.deleteClassfile(merged)) { env.debug("Deleted class %s", merged); } else { env.warn("Unable to delete class %s", merged); } } } }