Saturday, February 20, 2016

Java Byte Code



http://prismoskills.appspot.com/lessons/Super_Java/Insert_code_at_runtime.jsp
Javassist is a Java byte-code editor which allows to:
  1. Define a new class at runtime
  2. Modify a class file when the JVM loads it
  3. Insert byte-code in the form of source text, which is compiled on the fly by Javassist
  4. Add new methods to classes
public class DynamicCodeInsertion
{
    static String pkgName = "com.prismoskills.javassist.examples.annotation";
    public static void main(String[] args) throws Exception
    {
        ClassPool cp = ClassPool.getDefault();
        CtClass cc = cp.get(pkgName + ".FooCodeInsertion");
        // Without the call to "makePackage()", package information is lost
        cp.makePackage(cp.getClassLoader(), pkgName);
        CtMethod m = cc.getDeclaredMethod("helloWorld");
        m.insertBefore("{System.out.print(\"Oh, say no to \");}");
        m.insertAfter("{System.out.print(\"And say - Hi World\");}");
        // Changes are not persisted without a call to "toClass()"
        cc.toClass();

        (new FooCodeInsertion()).helloWorld();
    }

}
http://prismoskills.appspot.com/lessons/Super_Java/Dynamically_adding_annotations.jsp
public static void main(String[] args) throws Exception
{
    ClassPool cp = ClassPool.getDefault();
    CtClass cc = cp.get(pkgName + ".SomeClass");
    // Without the call to "makePackage()", package information is lost
    cp.makePackage(cp.getClassLoader(), pkgName);
    addAnnotation(cc, "someField", "java.lang.Deprecated");
    // Changes are not persisted without a call to "toClass()"
    Class<?> c = cc.toClass();

    Field fld = SomeClass.class.getDeclaredField("someField");
    System.out.println(c.getPackage());
    System.out.println(fld.getAnnotation(Deprecated.class));
}

public static void addAnnotation(
        CtClass clazz,
        String fieldName,
        String annotationName) throws Exception
{
    ClassFile cfile = clazz.getClassFile();
    ConstPool cpool = cfile.getConstPool();
    CtField cfield  = clazz.getField(fieldName);

    AnnotationsAttribute attr =
            new AnnotationsAttribute(cpool, AnnotationsAttribute.visibleTag);
    Annotation annot = new Annotation(annotationName, cpool);
    attr.addAnnotation(annot);
    cfield.getFieldInfo().addAttribute(attr);
}

Labels

Review (572) System Design (334) System Design - Review (198) Java (189) Coding (75) Interview-System Design (65) Interview (63) Book Notes (59) Coding - Review (59) to-do (45) Linux (43) Knowledge (39) Interview-Java (35) Knowledge - Review (32) Database (31) Design Patterns (31) Big Data (29) Product Architecture (28) MultiThread (27) Soft Skills (27) Concurrency (26) Cracking Code Interview (26) Miscs (25) Distributed (24) OOD Design (24) Google (23) Career (22) Interview - Review (21) Java - Code (21) Operating System (21) Interview Q&A (20) System Design - Practice (20) Tips (19) Algorithm (17) Company - Facebook (17) Security (17) How to Ace Interview (16) Brain Teaser (14) Linux - Shell (14) Redis (14) Testing (14) Tools (14) Code Quality (13) Search (13) Spark (13) Spring (13) Company - LinkedIn (12) How to (12) Interview-Database (12) Interview-Operating System (12) Solr (12) Architecture Principles (11) Resource (10) Amazon (9) Cache (9) Git (9) Interview - MultiThread (9) Scalability (9) Trouble Shooting (9) Web Dev (9) Architecture Model (8) Better Programmer (8) Cassandra (8) Company - Uber (8) Java67 (8) Math (8) OO Design principles (8) SOLID (8) Design (7) Interview Corner (7) JVM (7) Java Basics (7) Kafka (7) Mac (7) Machine Learning (7) NoSQL (7) C++ (6) Chrome (6) File System (6) Highscalability (6) How to Better (6) Network (6) Restful (6) CareerCup (5) Code Review (5) Hash (5) How to Interview (5) JDK Source Code (5) JavaScript (5) Leetcode (5) Must Known (5) Python (5)

Popular Posts