List of usage examples for org.objectweb.asm.commons Remapper Remapper
Remapper
From source file:com.alibaba.hotswap.processor.v.VClassGenerateVisitor.java
License:Open Source License
public VClassGenerateVisitor(ClassVisitor cv) { super(new VClassRemapperVisitor(cv, new Remapper() { public String mapType(String type) { if (HotswapRuntime.hasClassMeta(type) && type.equals(HotswapThreadLocalUtil.getClassName())) { int v = HotswapRuntime.getClassMeta(type).loadedIndex; return type + HotswapConstants.V_CLASS_PATTERN + v; }/*from w w w . j a va 2 s . c o m*/ return type; } })); }
From source file:com.github.dcevm.TestClassAdapter.java
License:Open Source License
public TestClassAdapter(ClassVisitor cv, final Map<String, String> typeMappings) { super(cv, new Remapper() { @Override/*ww w . ja va2 s . c o m*/ public String map(String type) { return typeMappings.containsKey(type) ? typeMappings.get(type) : type; } }); }
From source file:com.wolvereness.overmapped.OverMapped.java
License:Open Source License
private void process() throws Throwable { validateInput();/*from ww w . j a v a 2s . c o m*/ final MultiProcessor executor = MultiProcessor.newMultiProcessor(cores - 1, new ThreadFactoryBuilder().setDaemon(true) .setNameFormat(OverMapped.class.getName() + "-processor-%d") .setUncaughtExceptionHandler(this).build()); final Future<?> fileCopy = executor.submit(new Callable<Object>() { @Override public Object call() throws Exception { if (original != null) { if (original.exists()) { original.delete(); } Files.copy(input, original); } return null; } }); final Future<Iterable<?>> mappings = executor.submit(new Callable<Iterable<?>>() { @Override public Iterable<?> call() throws Exception { final Object yaml = new Yaml().load(Files.toString(maps, Charset.forName("UTF8"))); if (yaml instanceof Iterable) return (Iterable<?>) yaml; if (yaml instanceof Map) return ImmutableList.of(yaml); throw new ClassCastException(String.format("%s (%s) implements neither %s nor %s", yaml, yaml == null ? Object.class : yaml.getClass(), Iterable.class, Map.class)); } }); final Map<String, ByteClass> byteClasses = newLinkedHashMap(); final List<Pair<ZipEntry, byte[]>> fileEntries = newArrayList(); readClasses(executor, byteClasses, fileEntries); try { reorderEntries(byteClasses); } catch (final CircularOrderException ex) { final Throwable throwable = new MojoFailureException("Circular class hiearchy detected"); throwable.initCause(ex); throw throwable; } final Multimap<String, String> depends = processDepends(byteClasses); final Multimap<String, String> rdepends = processReverseDepends(depends); final BiMap<String, String> nameMaps = HashBiMap.create(byteClasses.size()); final BiMap<String, String> inverseNameMaps = nameMaps.inverse(); final BiMap<Signature, Signature> signatureMaps = HashBiMap.create(); final BiMap<Signature, Signature> inverseSignatureMaps = signatureMaps.inverse(); final Map<Signature, Integer> flags = newHashMap(); final Remapper inverseMapper = new Remapper() { @Override public String map(final String typeName) { final String name = inverseNameMaps.get(typeName); if (name != null) return name; return typeName; } }; prepareSignatures(byteClasses, rdepends, nameMaps, signatureMaps); final Signature.MutableSignature signature = Signature.newMutableSignature("", "", ""); final Set<String> searchCache = newHashSet(); for (final Object mapping : mappings.get()) { final Map<?, ?> map = (Map<?, ?>) mapping; for (final SubRoutine subRoutine : SubRoutine.SUB_ROUTINES) { try { subRoutine.invoke(this, byteClasses, depends, rdepends, nameMaps, inverseNameMaps, signatureMaps, inverseSignatureMaps, inverseMapper, signature, searchCache, flags, map); } catch (final Exception ex) { final Throwable throwable = new MojoFailureException("Failed to parse mappings in " + mapping); throwable.initCause(ex); throw throwable; } } } try { fileCopy.get(); } catch (final ExecutionException ex) { throw new MojoFailureException(String.format("Could not copy `%s' to `%s'", input, original)); } writeToFile(executor, byteClasses, fileEntries, nameMaps, signatureMaps, flags); executor.shutdown(); final Pair<Thread, Throwable> uncaught = this.uncaught; if (uncaught != null) throw new MojoExecutionException(String.format("Uncaught exception in %s", uncaught.getLeft()), uncaught.getRight()); }
From source file:de.bodden.tamiflex.normalizer.ClassRenamer.java
License:Open Source License
/** * Renames references to generated classes according to the mapping <code>fromTo</code> * in the bytecode <code>classBytes</code>. * @param fromTo This map must contain, for every generated class c an entry that maps c to * some other valid class name. Generated classes are such classes whose name is matched by * {@link Hasher#containsGeneratedClassName(String)}. * @param classBytes The bytecode in which the renaming should take place. This array wil remain * unmodified.// ww w . jav a2 s .c om * @return The bytecode containing the renamed references. */ public static byte[] replaceClassNamesInBytes(final Map<String, String> fromTo, byte[] classBytes) { ClassReader creader = new ClassReader(classBytes); ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS); RemappingClassAdapter visitor = new RemappingClassAdapter(writer, new Remapper() { //rename a type reference @Override public String map(String typeName) { String newName = fromTo.get(typeName); if (Hasher.containsGeneratedClassName(typeName) && newName == null) { throw new NoHashedNameException(typeName); } if (newName != null) typeName = newName; return super.map(typeName); } }) { //visit the body of the method @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); mv = new RemappingStringConstantAdapter(mv, new StringRemapper() { //rename any string constants @Override public String remapStringConstant(String constant) { //string constants will refer to the type using a dotted name; replace dots by slashes... String slashed = slashed(constant); String to = fromTo.get(slashed); if (Hasher.containsGeneratedClassName(slashed) && to == null) { throw new NoHashedNameException(slashed); } if (to != null) constant = dotted(to); return super.remapStringConstant(constant); } }); return mv; } }; creader.accept(visitor, 0); return writer.toByteArray(); }
From source file:de.bodden.tamiflex.normalizer.Hasher.java
License:Open Source License
public synchronized static void generateHashNumber(final String theClassName, byte[] classBytes) throws NoHashedNameException { boolean usingAssertions = false; assert usingAssertions = true; //if we don't use assertions then simply return if the hash code was alread computed if (!usingAssertions && generatedClassNameToHashedClassName.containsKey(theClassName)) return;//from w w w .ja v a2 s. c o m assert containsGeneratedClassName(theClassName) : "Class " + theClassName + " contains no generated name."; ClassReader creader = new ClassReader(classBytes); ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS); RemappingClassAdapter visitor = new RemappingClassAdapter(writer, new Remapper() { @Override public String map(String typeName) { if (theClassName.equals(typeName)) return "$$$NORMALIZED$$$"; String newName = generatedClassNameToHashedClassName.get(typeName); if (Hasher.containsGeneratedClassName(typeName) && newName == null) { throw new NoHashedNameException(typeName); } if (newName != null) typeName = newName; return super.map(typeName); } }) { @Override public void visitSource(String source, String debug) { /* we ignore the source-file attribute during hashing; * the position at which this attribute is inserted is kind of random, * and can therefore lead to unwanted noise */ } @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); mv = new RemappingStringConstantAdapter(mv, new StringRemapper() { @Override public String remapStringConstant(String constant) { String slashed = slashed(constant); if (theClassName.equals(slashed)) return "$$$NORMALIZED$$$"; String to = generatedClassNameToHashedClassName.get(slashed); if (!theClassName.equals(slashed) && Hasher.containsGeneratedClassName(slashed) && to == null) { throw new NoHashedNameException(slashed); } if (to != null) constant = dotted(to); return super.remapStringConstant(constant); } }); return mv; } }; creader.accept(visitor, 0); byte[] renamed = writer.toByteArray(); //////// String hash = SHAHash.SHA1(renamed); for (String infix : instableNames) { if (theClassName.contains(infix)) { String hashedName = theClassName.substring(0, theClassName.indexOf(infix) + infix.length()) + "$HASHED$" + hash; assert !generatedClassNameToHashedClassName.containsKey(theClassName) || generatedClassNameToHashedClassName.get(theClassName) .equals(hashedName) : "Hashed names not stable for " + theClassName + ": " + generatedClassNameToHashedClassName.get(theClassName) + "," + hashedName; generatedClassNameToHashedClassName.put(theClassName, hashedName); } } assert generatedClassNameToHashedClassName.containsKey(theClassName); }
From source file:de.bodden.tamiflex.normalizer.ReferencedClassesExtracter.java
License:Open Source License
public ReferencedClassesExtracter(ClassVisitor cv, final Set<String> res) { super(cv, new Remapper() { @Override/*from w ww . j av a 2 s.c o m*/ public String map(String typeName) { if (containsGeneratedClassName(typeName)) res.add(typeName); return super.map(typeName); } }); this.res = res; }
From source file:edu.ubc.mirrors.holographs.jdkplugins.GeneratedBytecodeProvider.java
License:Open Source License
public byte[] getGeneratedConstructorAccessorBytecode(ClassMirror classMirror) { VirtualMachineMirror vm = classMirror.getVM(); try {/*from w w w .j av a 2s .c o m*/ ClassMirror consClass = vm.findBootstrapClassMirror(Constructor.class.getName()); FieldMirror accessorField = consClass.getDeclaredField("constructorAccessor"); ClassMirror delegatingClass = vm .findBootstrapClassMirror("sun.reflect.DelegatingConstructorAccessorImpl"); FieldMirror delegateField = delegatingClass.getDeclaredField("delegate"); for (ObjectMirror method : consClass.getInstances()) { InstanceMirror m = (InstanceMirror) method; ObjectMirror accessor = m.get(accessorField); if (accessor != null) { while (accessor.getClassMirror().equals(delegatingClass)) { accessor = ((InstanceMirror) accessor).get(delegateField); } if (accessor.getClassMirror().equals(classMirror)) { ConstructorMirror consMirror = Reflection.constructorMirrorForConstructorInstance(m); // Could cache this per VM, but likely not worth it. ClassMirror classClass = vm.findBootstrapClassMirror(Class.class.getName()); ClassMirror generatorClass = vm .findBootstrapClassMirror("sun.reflect.MethodAccessorGenerator"); MethodMirror generateMethod = generatorClass.getDeclaredMethod("generateConstructor", "java.lang.Class", "java.lang.Class[]", "java.lang.Class[]", "int"); // This will have the side-effect of defining a new class, but it should // be totally transparent. InstanceMirror generator = generatorClass.getConstructor() .newInstance(ThreadHolograph.currentThreadMirror()); InstanceMirror duplicateAccessor = (InstanceMirror) generateMethod.invoke( ThreadHolograph.currentThreadMirror(), generator, consMirror.getDeclaringClass(), Reflection.toArray(classClass, consMirror.getParameterTypes()), Reflection.toArray(classClass, consMirror.getExceptionTypes()), consMirror.getModifiers()); ClassMirror newClass = duplicateAccessor.getClassMirror(); // Rename from whatever was generated to what we want. byte[] generatedBytecode = newClass.getBytecode(); ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS); ClassVisitor visitor = classWriter; final String internalName = classMirror.getClassName().replace('.', '/'); final String generatedInternalName = newClass.getClassName().replace('.', '/'); visitor = new RemappingClassAdapter(visitor, new Remapper() { @Override public String map(String typeName) { if (typeName.equals(generatedInternalName)) { return internalName; } return super.map(typeName); } }); new ClassReader(generatedBytecode).accept(visitor, 0); return classWriter.toByteArray(); } } } } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (SecurityException e) { throw new RuntimeException(e); } catch (NoSuchMethodException e) { throw new RuntimeException(e); } catch (MirrorInvocationTargetException e) { throw new RuntimeException(e); } return null; }
From source file:edu.ubc.mirrors.holographs.jdkplugins.GeneratedBytecodeProvider.java
License:Open Source License
public byte[] getGeneratedMethodAccessorBytecode(ClassMirror classMirror) { VirtualMachineMirror vm = classMirror.getVM(); try {/*ww w.ja v a2 s.c o m*/ ClassMirror methodClass = vm.findBootstrapClassMirror(Method.class.getName()); FieldMirror accessorField = methodClass.getDeclaredField("methodAccessor"); ClassMirror delegatingClass = vm.findBootstrapClassMirror("sun.reflect.DelegatingMethodAccessorImpl"); FieldMirror delegateField = delegatingClass.getDeclaredField("delegate"); for (ObjectMirror method : methodClass.getInstances()) { InstanceMirror m = (InstanceMirror) method; ObjectMirror accessor = m.get(accessorField); if (accessor != null) { while (accessor.getClassMirror().equals(delegatingClass)) { accessor = ((InstanceMirror) accessor).get(delegateField); } if (accessor.getClassMirror().equals(classMirror)) { MethodMirror methodMirror = Reflection.methodMirrorForMethodInstance(m); // Could cache this per VM, but likely not worth it. ClassMirror classClass = vm.findBootstrapClassMirror(Class.class.getName()); ClassMirror generatorClass = vm .findBootstrapClassMirror("sun.reflect.MethodAccessorGenerator"); MethodMirror generateMethod = generatorClass.getDeclaredMethod("generateMethod", "java.lang.Class", "java.lang.String", "java.lang.Class[]", "java.lang.Class", "java.lang.Class[]", "int"); // This will have the side-effect of defining a new class, but it should // be totally transparent. InstanceMirror generator = generatorClass.getConstructor() .newInstance(ThreadHolograph.currentThreadMirror()); InstanceMirror duplicateAccessor = (InstanceMirror) generateMethod.invoke( ThreadHolograph.currentThreadMirror(), generator, methodMirror.getDeclaringClass(), vm.makeString(methodMirror.getName()), Reflection.toArray(classClass, methodMirror.getParameterTypes()), methodMirror.getReturnType(), Reflection.toArray(classClass, methodMirror.getExceptionTypes()), methodMirror.getModifiers()); ClassMirror newClass = duplicateAccessor.getClassMirror(); // Rename from whatever was generated to what we want. byte[] generatedBytecode = newClass.getBytecode(); ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS); ClassVisitor visitor = classWriter; final String internalName = classMirror.getClassName().replace('.', '/'); final String generatedInternalName = newClass.getClassName().replace('.', '/'); visitor = new RemappingClassAdapter(visitor, new Remapper() { @Override public String map(String typeName) { if (typeName.equals(generatedInternalName)) { return internalName; } return super.map(typeName); } }); new ClassReader(generatedBytecode).accept(visitor, 0); return classWriter.toByteArray(); } } } } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (SecurityException e) { throw new RuntimeException(e); } catch (NoSuchMethodException e) { throw new RuntimeException(e); } catch (MirrorInvocationTargetException e) { throw new RuntimeException(e); } return null; }
From source file:jtaint.RemappingMiscClassAdapter.java
License:Apache License
public RemappingMiscClassAdapter(final ClassVisitor cv, final Map typeMap) { super(cv, new Remapper() { public String map(String typeName) { if (typeMap.containsKey(typeName)) return (String) typeMap.get(typeName); return typeName; }//from ww w . j a va 2s. c om }); }
From source file:jtaint.RemappingStringClassAdapter.java
License:Apache License
public RemappingStringClassAdapter(ClassVisitor cv) { super(cv, new Remapper() { public String map(String typeName) { if (stringMap.containsKey(typeName)) return (String) stringMap.get(typeName); return typeName; }/*from w w w . j a v a 2s .c o m*/ }); }