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); } }
@Override public String mapInvokeDynamicMethodName(String name, String desc) { String s = map('.' + name + desc); return s == null ? name : s; }
@Override public String mapInvokeDynamicMethodName(final String name, final String descriptor) { String remappedName = map('.' + name + descriptor); return remappedName == null ? name : remappedName; }
@Override public String mapFieldName(final String owner, final String name, final String descriptor) { String remappedName = map(owner + '.' + name); return remappedName == null ? name : remappedName; }
@RequiresNonNull("type") private void addMixin(ClassNode mixinClassNode) { List<FieldNode> fieldNodes = mixinClassNode.fields; for (FieldNode fieldNode : fieldNodes) { if (!Modifier.isTransient(fieldNode.access)) { // this is needed to avoid serialization issues (even if the new field is // serializable, this can still cause issues in a cluster if glowroot is not // deployed on all nodes) throw new IllegalStateException( "@Mixin fields must be marked transient: " + mixinClassNode.name); } fieldNode.accept(this); } List<MethodNode> methodNodes = mixinClassNode.methods; for (MethodNode mn : methodNodes) { if (mn.name.equals("<init>")) { continue; } String[] exceptions = Iterables.toArray(mn.exceptions, String.class); MethodVisitor mv = cw.visitMethod(mn.access, mn.name, mn.desc, mn.signature, exceptions); mn.accept(new MethodRemapper(mv, new SimpleRemapper(mixinClassNode.name, type.getInternalName()))); } }
@Override public String mapMethodName(final String owner, final String name, final String descriptor) { String remappedName = map(owner + '.' + name + descriptor); return remappedName == null ? name : remappedName; }
private void mergeMixinMethods() { Remapper remapper = new SimpleRemapper(mixinClassNode.name, classNode.name); for (MethodNode mixinMethodNode : (List<MethodNode>) mixinClassNode.methods) { //all constructors and static constructors of the mixinClassNode are dropped if (!mixinMethodNode.name.equals("<init>") && !mixinMethodNode.name.equals("<clinit>")) { MethodNode remappedMethod = remap(mixinMethodNode, remapper); classNode.methods.add(remappedMethod); } } }
@Override public String mapInvokeDynamicMethodName(final String name, final String descriptor) { String remappedName = map('.' + name + descriptor); return remappedName == null ? name : remappedName; }
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); } }
@Override public String mapFieldName(final String owner, final String name, final String descriptor) { String remappedName = map(owner + '.' + name); return remappedName == null ? name : remappedName; }
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); } }
@Override public String mapMethodName(final String owner, final String name, final String descriptor) { String remappedName = map(owner + '.' + name + descriptor); return remappedName == null ? name : remappedName; }
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); } }
@Override public String mapInvokeDynamicMethodName(final String name, final String descriptor) { String remappedName = map('.' + name + descriptor); return remappedName == null ? name : remappedName; }
new SimpleRemapper(top.precompiled.slash, top.generated.slash)));
@Override public String mapMethodName(String owner, String name, String desc) { String s = map(owner + '.' + name + desc); return s == null ? name : s; }
new SimpleRemapper( HELP_MOJO_CLASS_NAME, packageAsDirectory + '/' + HELP_MOJO_CLASS_NAME ); ClassVisitor cv = new ClassRemapper( cw, packageRemapper );
@Override public String mapMethodName(final String owner, final String name, final String descriptor) { String remappedName = map(owner + '.' + name + descriptor); return remappedName == null ? name : remappedName; }
private void mergeStaticInitializers() { Remapper remapper = new SimpleRemapper(mixinClassNode.name, classNode.name); MethodNode mixinStaticInit = findStaticInitializer(mixinClassNode); if (mixinStaticInit != null) { MethodNode txObjectStaticInit = findStaticInitializer(classNode); if (txObjectStaticInit == null) { MethodNode remappedInit = remap(mixinStaticInit, remapper); classNode.methods.add(remappedInit); } else { MethodNode originalStaticInit = remap(mixinStaticInit, remapper); originalStaticInit.name = "___clinit_mixin"; txObjectStaticInit.name = "___clinit_txobject"; MethodNode replacementStaticInit = new MethodNode(); replacementStaticInit.name = "<clinit>"; replacementStaticInit.desc = txObjectStaticInit.desc; replacementStaticInit.access = mixinStaticInit.access; replacementStaticInit.tryCatchBlocks = new LinkedList(); replacementStaticInit.exceptions = new LinkedList(); replacementStaticInit.localVariables = new LinkedList(); replacementStaticInit.visitMethodInsn(INVOKESTATIC, classNode.name, originalStaticInit.name, "()V"); replacementStaticInit.visitMethodInsn(INVOKESTATIC, classNode.name, txObjectStaticInit.name, "()V"); replacementStaticInit.visitInsn(RETURN); classNode.methods.add(replacementStaticInit); classNode.methods.add(originalStaticInit); } } }
@Override public String mapFieldName(final String owner, final String name, final String descriptor) { String remappedName = map(owner + '.' + name); return remappedName == null ? name : remappedName; }