List of usage examples for org.objectweb.asm Opcodes ASM5
int ASM5
To view the source code for org.objectweb.asm Opcodes ASM5.
Click Source Link
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); }