Example usage for org.objectweb.asm Opcodes ASM5

List of usage examples for org.objectweb.asm Opcodes ASM5

Introduction

In this page you can find the example usage for org.objectweb.asm Opcodes ASM5.

Prototype

int ASM5

To view the source code for org.objectweb.asm Opcodes ASM5.

Click Source Link

Usage

From source file:org.coldswap.tracker.ClassListener.java

License:Open Source License

@Override
public void fileModified(int i, String root, String className) {
    if ((!"".equals(className)) && (null != className))
        if (filter.accept(new File(className))) {
            Map<String, Class<?>> loaded = ClassInstrumenter.getInstance().getLoadedClasses();
            byte[] bytes = ByteCodeClassLoader.loadClassBytes(root + sep + className);
            // first eight bytes for versioning
            if (bytes.length < 8) {
                return;
            }//from w ww  . ja v a 2s .  c  om
            ClassNode classNode = new ClassNode(Opcodes.ASM5);
            ClassReader classReader = new ClassReader(bytes);
            classReader.accept(classNode, 0);
            String clsName = classNode.name.replace('/', '.').replace(".class", "");

            logger.info("Class " + clsName + " has been modified on the disk");

            if ((!"".equals(clsName)) && (null != clsName)) {
                Class<?> clazz = loaded.get(clsName);
                if (clazz == null) {
                    logger.info(clsName + " is new class file!");
                    try {
                        Class<?> cla = Class.forName(clsName);
                        // run reference replacer
                        bytes = refManager.runReferenceReplacer(bytes);
                        ClassDefinition def = new ClassDefinition(cla, bytes);
                        Instrumentation inst = ClassInstrumenter.getInstance().getInstrumenter();
                        inst.redefineClasses(def);
                    } catch (ClassNotFoundException e) {
                        // it means that the class was not loaded yet into machine
                        // so no worries here
                    } catch (UnmodifiableClassException e) {
                        logger.warning(toString());
                    }

                    return;
                }
                ClassRedefiner redefiner = new ClassRedefiner(clsName, root + sep + className,
                        maxNumberOfMethods);
                try {
                    redefiner.redefineClass(clazz);
                } catch (UnmodifiableClassException e) {
                    logger.severe(e.toString());
                } catch (ClassNotFoundException e) {
                    logger.severe(e.toString());
                }
            }
        }
}

From source file:org.coldswap.transformer.ClInitTransformer.java

License:Open Source License

@SuppressWarnings("unchecked")
@Override//www. ja  v  a 2 s.co  m
public byte[] transform(ClassLoader classLoader, String s, Class<?> aClass, ProtectionDomain protectionDomain,
        byte[] bytes) throws IllegalClassFormatException {
    if (s != null && !"".equals(s)) {
        for (String pack : ClassUtil.skipTransforming) {
            if (s.startsWith(pack)) {
                return bytes;
            }
        }

        ClassNode cn = new ClassNode(Opcodes.ASM5);
        ClassReader cr = new ClassReader(bytes);
        ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
        // create adapter for method insertion.
        cr.accept(cn, 0);
        // insert <clinit>V if it is not inserted
        List methods = cn.methods;
        boolean clInitFound = false;
        for (MethodNode methodNode : (List<MethodNode>) methods) {
            if ("<clinit>".equals(methodNode.name)) {
                clInitFound = true;
            }
        }

        if (!clInitFound) {
            MethodNode mn = new MethodNode(Opcodes.ACC_STATIC, "<clinit>", "()V", null, null);
            InsnList insnList = mn.instructions;
            insnList.add(new LabelNode());
            insnList.add(new InsnNode(Opcodes.RETURN));
            cn.methods.add(mn);
        }

        cn.accept(cw);
        byte[] toRet = cw.toByteArray();
        if (toRet != null) {
            logger.info("Successful transformation!");
            return toRet;
        } else {
            logger.severe("Could not transform class");
            return bytes;
        }
    }
    return bytes;
}

From source file:org.coldswap.transformer.FloatMethodTransformer.java

License:Open Source License

@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
        ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
    if (className != null && !"".equals(className)) {
        for (String pack : ClassUtil.skipTransforming) {
            if (className.startsWith(pack)) {
                return classfileBuffer;
            }//from  ww w . j  a va  2  s .c om
        }

        ClassNode cn = new ClassNode(Opcodes.ASM5);
        ClassReader cr = new ClassReader(classfileBuffer);
        ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
        // create adapter for method insertion.
        cr.accept(cn, 0);
        // create a list of method name's so that we resolve method collision
        List<MethodNode> methodNodes = cn.methods;
        Iterator it = methodNodes.iterator();
        List<String> methodNames = new ArrayList<String>(methodNodes.size());
        while (it.hasNext()) {
            MethodNode methodNode = (MethodNode) it.next();
            methodNames.add(methodNode.name);
        }
        // insert helper methods if they do not exist.
        for (int i = 0; i < maxNumberOfMethods; i++) {
            String name = TransformerNameGenerator.getFloatMethodNameWithCounter(className, i);
            if (!methodNames.contains(name)) {
                MethodNode mn = MethodUtil.createFloatHelperMethod(className, i);
                cn.methods.add(mn);
            }
        }
        cn.accept(cw);
        byte[] toRet = cw.toByteArray();
        if (toRet != null) {
            logger.info("Successful transformation!");
            return toRet;
        } else {
            logger.severe("Could not transform class");
            return classfileBuffer;
        }
    }
    return classfileBuffer;

}

From source file:org.coldswap.transformer.IntMethodTransformer.java

License:Open Source License

@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
        ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
    if (className != null && !"".equals(className)) {
        for (String pack : ClassUtil.skipTransforming) {
            if (className.startsWith(pack)) {
                return classfileBuffer;
            }/*from   w  w w.java 2 s .  c  o m*/
        }

        ClassNode cn = new ClassNode(Opcodes.ASM5);
        ClassReader cr = new ClassReader(classfileBuffer);
        ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
        // create adapter for method insertion.
        cr.accept(cn, 0);
        // create a list of method name's so that we resolve method collision
        List<MethodNode> methodNodes = cn.methods;
        Iterator it = methodNodes.iterator();
        List<String> methodNames = new ArrayList<String>(methodNodes.size());
        while (it.hasNext()) {
            MethodNode methodNode = (MethodNode) it.next();
            methodNames.add(methodNode.name);
        }
        // insert helper methods if they do not exist.
        for (int i = 0; i < maxNumberOfMethods; i++) {
            String name = TransformerNameGenerator.getIntMethodNameWithCounter(className, i);
            if (!methodNames.contains(name)) {
                MethodNode mn = MethodUtil.createIntHelperMethod(className, i);
                cn.methods.add(mn);
            }
        }
        cn.accept(cw);
        byte[] toRet = cw.toByteArray();
        if (toRet != null) {
            logger.info("Successful transformation!");
            return toRet;
        } else {
            logger.severe("Could not transform class");
            return classfileBuffer;
        }
    }
    return classfileBuffer;

}

From source file:org.coldswap.transformer.LongMethodTransformer.java

License:Open Source License

@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
        ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
    if (className != null && !"".equals(className)) {
        for (String pack : ClassUtil.skipTransforming) {
            if (className.startsWith(pack)) {
                return classfileBuffer;
            }/*from   w w w .ja v a2 s  .c o m*/
        }

        ClassNode cn = new ClassNode(Opcodes.ASM5);
        ClassReader cr = new ClassReader(classfileBuffer);
        ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
        // create adapter for method insertion.
        cr.accept(cn, 0);
        // create a list of method name's so that we resolve method collision
        List<MethodNode> methodNodes = cn.methods;
        Iterator it = methodNodes.iterator();
        List<String> methodNames = new ArrayList<String>(methodNodes.size());
        while (it.hasNext()) {
            MethodNode methodNode = (MethodNode) it.next();
            methodNames.add(methodNode.name);
        }
        // insert helper methods if they do not exist.
        for (int i = 0; i < maxNumberOfMethods; i++) {
            String name = TransformerNameGenerator.getLongMethodNameWithCounter(className, i);
            if (!methodNames.contains(name)) {
                MethodNode mn = MethodUtil.createLongHelperMethod(className, i);
                cn.methods.add(mn);
            }
        }
        cn.accept(cw);
        byte[] toRet = cw.toByteArray();
        if (toRet != null) {
            logger.info("Successful transformation!");
            return toRet;
        } else {
            logger.severe("Could not transform class");
            return classfileBuffer;
        }
    }
    return classfileBuffer;

}

From source file:org.coldswap.transformer.ObjectMethodTransformer.java

License:Open Source License

@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
        ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
    if (className != null && !"".equals(className)) {
        for (String pack : ClassUtil.skipTransforming) {
            if (className.startsWith(pack)) {
                return classfileBuffer;
            }// w w  w  . j  a va  2  s.c  om
        }

        ClassNode cn = new ClassNode(Opcodes.ASM5);
        ClassReader cr = new ClassReader(classfileBuffer);
        ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
        // create adapter for method insertion.
        cr.accept(cn, 0);
        // create a list of method name's so that we resolve method collision
        List<MethodNode> methodNodes = cn.methods;
        Iterator it = methodNodes.iterator();
        List<String> methodNames = new ArrayList<String>(methodNodes.size());
        while (it.hasNext()) {
            MethodNode methodNode = (MethodNode) it.next();
            methodNames.add(methodNode.name);
        }
        // insert helper methods if they do not exist.
        for (int i = 0; i < maxNumberOfMethods; i++) {
            String name = TransformerNameGenerator.getObjectMethodNameWithCounter(className, i);
            if (!methodNames.contains(name)) {
                MethodNode mn = MethodUtil.createObjectHelperMethod(className, i);
                cn.methods.add(mn);
            }
        }
        cn.accept(cw);
        byte[] toRet = cw.toByteArray();
        if (toRet != null) {
            logger.info("Successful transformation!");
            return toRet;
        } else {
            logger.severe("Could not transform class");
            return classfileBuffer;
        }
    }
    return classfileBuffer;

}

From source file:org.coldswap.transformer.ReferenceReplacerManager.java

License:Open Source License

/**
 * Starts the process of find and replace for the given class node.
 *
 * @param clazz where to find and replace.
 * @return transformed class byte array.
 *//*from w w w  . ja v  a 2  s .  c om*/
public byte[] runReferenceReplacer(byte[] clazz) {
    ClassNode classNode = new ClassNode(Opcodes.ASM5);
    ClassReader classReader = new ClassReader(clazz);
    ClassWriter classWriter = new ClassWriter(classReader,
            ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
    classReader.accept(classNode, 0);
    for (ReferenceReplacer replacer : fieldReferences) {
        replacer.findAndReplace(classNode);
    }

    classNode.accept(classWriter);
    return classWriter.toByteArray();
}

From source file:org.coldswap.transformer.StringMethodTransformer.java

License:Open Source License

@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
        ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
    if (className != null && !"".equals(className)) {
        for (String pack : ClassUtil.skipTransforming) {
            if (className.startsWith(pack)) {
                return classfileBuffer;
            }//w  w w. j  a v  a  2s. c  o  m
        }

        ClassNode cn = new ClassNode(Opcodes.ASM5);
        ClassReader cr = new ClassReader(classfileBuffer);
        ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
        // create adapter for method insertion.
        cr.accept(cn, 0);
        // create a list of method name's so that we resolve method collision
        List<MethodNode> methodNodes = cn.methods;
        Iterator it = methodNodes.iterator();
        List<String> methodNames = new ArrayList<String>(methodNodes.size());
        while (it.hasNext()) {
            MethodNode methodNode = (MethodNode) it.next();
            methodNames.add(methodNode.name);
        }
        // insert helper methods if they do not exist.
        for (int i = 0; i < maxNumberOfMethods; i++) {
            String name = TransformerNameGenerator.getStringMethodNameWithCounter(className, i);
            if (!methodNames.contains(name)) {
                MethodNode mn = MethodUtil.createStringHelperMethod(className, i);
                cn.methods.add(mn);
            }
        }
        cn.accept(cw);
        byte[] toRet = cw.toByteArray();
        if (toRet != null) {
            logger.info("Successful transformation!");
            return toRet;
        } else {
            logger.severe("Could not transform class");
            return classfileBuffer;
        }
    }
    return classfileBuffer;

}

From source file:org.decojer.cavaj.readers.asm.ReadAnnotationVisitor.java

License:Open Source License

/**
 * Constructor./*from w ww  . j ava 2s .  co m*/
 *
 * @param parentVisitor
 *            parent visitor
 */
public ReadAnnotationVisitor(@Nonnull final ReadVisitor parentVisitor) {
    super(Opcodes.ASM5);
    this.parentVisitor = parentVisitor;
}

From source file:org.decojer.cavaj.readers.asm.ReadClassVisitor.java

License:Open Source License

/**
 * Constructor./*from w ww.j a  v a 2  s .  c  o  m*/
 *
 * @param du
 *            decompilation unit
 */
public ReadClassVisitor(@Nonnull final DU du) {
    super(Opcodes.ASM5);
    this.du = du;
    this.readAnnotationMemberVisitor = new ReadAnnotationMemberVisitor(this);
    this.readFieldVisitor = new ReadFieldVisitor(this);
    this.readMethodVisitor = new ReadMethodVisitor(this);
}