T specialize(ImmutableMap<Class<?>, Class<?>> classRemapping) { String specializedClassName = specializedClassNamePrefix + specializedClassCounter.get(); ClassWriter specializedClassWriter = new ClassWriter(0); SimpleRemapper remapper = new SimpleRemapper(createRemapping(classRemapping, specializedClassName)); ClassVisitor classTransformer = new ClassRemapper(specializedClassWriter, remapper); try { ClassReader prototypeClassReader = new ClassReader(getPrototypeClassBytecode()); prototypeClassReader.accept(classTransformer, 0); byte[] specializedClassBytecode = specializedClassWriter.toByteArray(); Class<T> specializedClass = defineClass(specializedClassName, specializedClassBytecode); specializedClassCounter.incrementAndGet(); return specializedClass.newInstance(); } catch (InstantiationException | IllegalAccessException | IOException e) { throw new RuntimeException(e); } }
byte[] instrumentToBytes(MutableClass mutableClass) { instrument(mutableClass); ClassNode classNode = mutableClass.classNode; ClassWriter writer = new InstrumentingClassWriter(mutableClass.classNodeProvider, classNode); Remapper remapper = new Remapper() { @Override public String map(final String internalName) { return mutableClass.config.mappedTypeName(internalName); } }; ClassRemapper visitor = new ClassRemapper(writer, remapper); classNode.accept(visitor); return writer.toByteArray(); }
@Override protected Class<?> findClass(String name) throws ClassNotFoundException { String key = findKeyFromValue(name).orElseGet(() -> null); if(key == null) { return super.findClass(name); } String path = key.replace('.', '/').concat(".class"); try (InputStream resource = getResourceAsStream(path)) { ClassReader reader = new ClassReader(resource); ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS); Remapper remapper = new Remapper() { @Override public String map(String from) { String to = remappings.get(from.replace('/', '.')); if (to == null) { return from; } return to.replace('.', '/'); } }; reader.accept(new ClassRemapper(writer, remapper), ClassReader.EXPAND_FRAMES); byte[] classBytes = writer.toByteArray(); return defineClass(name, classBytes, 0, classBytes.length); } catch (IOException e) { throw new ClassNotFoundException("IOException while loading", e); } } }
private LazyDefinedClass build(String internalName, byte[] origBytes) throws IOException { processed.add(internalName); 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(); }
private static byte[] deobfClass(byte[] classData, final Map<String, String> methods, final Map<String, String> fields) { ClassReader reader = new ClassReader(classData); ClassWriter writer = new ClassWriter(0); Remapper remapper = new Remapper() { @Override public String mapFieldName(final String owner, final String name, final String desc) { String mappedName = fields.get(name); return mappedName != null ? mappedName : name; } @Override public String mapMethodName(final String owner, final String name, final String desc) { String mappedName = methods.get(name); return mappedName != null ? mappedName : name; } @Override public String mapInvokeDynamicMethodName(final String name, final String desc) { String mappedName = methods.get(name); return mappedName != null ? mappedName : name; } }; ClassRemapper adapter = new ClassRemapper(writer, remapper); reader.accept(adapter, ClassReader.EXPAND_FRAMES); return writer.toByteArray(); }
static byte[] createFaviconServletExtension(String name) throws IOException { ClassReader reader = new ClassReader(FaviconServletExtension.class.getClassLoader().getResourceAsStream(FaviconServletExtension.class.getName().replace('.', '/') + ".class")); String slashName = name.replace('.', '/'); ClassWriter writer = new ClassWriter(0); Remapper remapper = new Remapper() { @Override public String map(String typeName) { if (typeName.equals("org/wildfly/swarm/undertow/internal/FaviconServletExtension")) { return slashName; } return super.map(typeName); } }; ClassRemapper adapter = new ClassRemapper(writer, remapper); reader.accept(adapter, ClassReader.EXPAND_FRAMES); writer.visitEnd(); return writer.toByteArray(); }
static byte[] createFaviconErrorHandler(String name) throws IOException { ClassReader reader = new ClassReader(FaviconErrorHandler.class.getClassLoader().getResourceAsStream(FaviconErrorHandler.class.getName().replace('.', '/') + ".class")); String slashName = name.replace('.', '/'); ClassWriter writer = new ClassWriter(0); Remapper remapper = new Remapper() { @Override public String map(String typeName) { if (typeName.equals("org/wildfly/swarm/undertow/internal/FaviconErrorHandler")) { return slashName; } return super.map(typeName); } }; ClassRemapper adapter = new ClassRemapper(writer, remapper); reader.accept(adapter, ClassReader.EXPAND_FRAMES); writer.visitEnd(); return writer.toByteArray(); } }
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; } 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); } }
T specialize(ImmutableMap<Class<?>, Class<?>> classRemapping) { String specializedClassName = specializedClassNamePrefix + specializedClassCounter.get(); ClassWriter specializedClassWriter = new ClassWriter(0); SimpleRemapper remapper = new SimpleRemapper(createRemapping(classRemapping, specializedClassName)); ClassVisitor classTransformer = new ClassRemapper(specializedClassWriter, remapper); try { ClassReader prototypeClassReader = new ClassReader(getPrototypeClassBytecode()); prototypeClassReader.accept(classTransformer, 0); byte[] specializedClassBytecode = specializedClassWriter.toByteArray(); Class<T> specializedClass = defineClass(specializedClassName, specializedClassBytecode); specializedClassCounter.incrementAndGet(); return specializedClass.newInstance(); } catch (InstantiationException | IllegalAccessException | IOException e) { throw new RuntimeException(e); } }
T specialize(ImmutableMap<Class<?>, Class<?>> classRemapping) { String specializedClassName = specializedClassNamePrefix + specializedClassCounter.get(); ClassWriter specializedClassWriter = new ClassWriter(0); SimpleRemapper remapper = new SimpleRemapper(createRemapping(classRemapping, specializedClassName)); ClassVisitor classTransformer = new ClassRemapper(specializedClassWriter, remapper); try { ClassReader prototypeClassReader = new ClassReader(getPrototypeClassBytecode()); prototypeClassReader.accept(classTransformer, 0); byte[] specializedClassBytecode = specializedClassWriter.toByteArray(); Class<T> specializedClass = defineClass(specializedClassName, specializedClassBytecode); specializedClassCounter.incrementAndGet(); return specializedClass.newInstance(); } catch (InstantiationException | IllegalAccessException | IOException e) { throw new RuntimeException(e); } }
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 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(); } }
ClassVisitor ca = new ClassRemapper(writer, srg); cr.accept(ca, 0); entryData = writer.toByteArray();
ClassVisitor cv = new ClassRemapper( cw, packageRemapper );
classNode.accept(new ClassRemapper(copy, simpleRemapper)); for (int i = 0; i < copy.methods.size(); i++) { classWrapper.methods.get(i).methodNode = copy.methods.get(i);