ASM 改写方法

原创 2011年10月13日 15:39:19

Generator.java


import java.io.File;
import java.io.FileOutputStream;

import org.objectweb.asm.ClassAdapter;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Opcodes;

public class Generator  extends ClassLoader implements Opcodes {

 /**
  * @param args
  */
 public static void  main(String[] args) throws Exception {
     ClassReader cr = new ClassReader("MyBeanHello");
     ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
     ClassAdapter classAdapter =  new MyClassAdapter(cw);
     cr.accept(classAdapter, ClassReader.SKIP_DEBUG);
     byte[] code = cw.toByteArray();
     Generator loader = new Generator();
     Class<?> exampleClass = loader.defineClass("MyBeanHello", code, 0, code.length);
     exampleClass.getMethods()[3].invoke(exampleClass.newInstance(), new   Object[]{ "Jack "} );   
     byte[] data = cw.toByteArray();
     File file = new File("/devTool/MyBeanHello.class");
     FileOutputStream fout = new FileOutputStream(file);
     fout.write(data);
     fout.close();

 }

}


MyBeanHello.java


public class MyBeanHello {

    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        System.out.println(" run "+name);
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
      
    public String toString(){
        return "name:"+name+";age:"+age;
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println("run main ");
        System.out.println( new MyBeanHello().toString());
}

}

MyClassAdapter.java


import org.objectweb.asm.ClassAdapter;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.MethodVisitor;

public class MyClassAdapter extends ClassAdapter {

    public MyClassAdapter(ClassVisitor cv) {
        super(cv);
    }

    public MethodVisitor visitMethod(int access, String name, String desc,String signature, String[] exceptions) {
        
        MethodVisitor mv = cv.visitMethod(access, name, desc, signature,exceptions);
        MethodVisitor wrappedMv = mv;
        if (mv != null) {
      
            if (name.equals("setName")) {
                // 使用自定义 MethodVisitor,实际改写方法内容
                wrappedMv = new MyMethodAdapter(mv);
            } else {
            }
        }
        return wrappedMv;

    }
 
}


MyMethodAdapter.java

import org.objectweb.asm.Label;
import org.objectweb.asm.MethodAdapter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;

public class MyMethodAdapter extends MethodAdapter {

    public MyMethodAdapter(MethodVisitor mv) {
        super(mv);
        mv.visitCode();
        Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(4, l0);
        mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
        mv.visitLdcInsn(" MyMethodAdapter  Code add By ASM Eclipse ");
        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
        Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLineNumber(5, l1);
//        mv.visitInsn(Opcodes.RETURN);
    }
}

用jad反编译后的MyBeanHello.java


// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/kpdus/jad.html
// Decompiler options: packimports(3)

import java.io.PrintStream;

public class MyBeanHello
{

    public MyBeanHello()
    {
    }

    public String getName()
    {
        return name;
    }

    public void setName(String s)
    {
        System.out.println(" MyMethodAdapter  Code add By ASM Eclipse ");
        System.out.println((new StringBuilder(" run ")).append(s).toString());

    }

    public int getAge()
    {
        return age;
    }

    public void setAge(int i)
    {
        age = i;
    }

    public String toString()
    {
        return (new StringBuilder("name:")).append(name).append(";age:").append(age).toString();
    }

    public static void main(String args[])
    {
        System.out.println("run main ");
        System.out.println((new MyBeanHello()).toString());
    }

    private String name;
    private int age;
}

ASM函数监听实现-之简单静态方法注入

1.目的:实现对函数执行监听,在函数调用前,后得到通知。考虑用asm来实现。  2.资料:在网上看到关于asm的技术资料,写了一个简单的实现。参考链接如下:  http://www.cnblogs...
  • youling_lh
  • youling_lh
  • 2013-08-14 19:44:16
  • 1366

java 继承时方法的改写

今日阅读java的书籍时,注意到书上写:类方法不能被改写,否则会发生编译时错误。 但是进过测试,jdk8的类方法可以被继承且能够改写。说到继承,不得不说变量与方法的覆盖和隐藏,当下层类出现于上层...
  • Mowen_Yi
  • Mowen_Yi
  • 2017-10-11 11:26:02
  • 175

ASM系列之五:操作类方法

前面我们了解了如何使用ASM的CoreAPI来操作一个类的属性,现在我们来看一下如何修改一个类方法。 场景:假设我们有一个Person类,它当中有一个sleep方法,我们希望监控一下这个slee...
  • ywb201314
  • ywb201314
  • 2016-11-10 16:42:11
  • 684

改写equals与hashCode的简单方法

Apache Commons Lang库中的EqualsBuilder与HashCodeBuilder类可以简化Java类中equals与hashCode方法的改写过程。 关于如何改变 Java类中...
  • houpengfei111
  • houpengfei111
  • 2012-11-16 18:23:43
  • 1410

怎样正确改写Equals方法

地球人都知道,equals方法需要满足自反,对称,传递,一致,非空特性,如果我们需要在代码中改写equals方法,怎么样才能保证这几个特性呢?(1)使用==操作符来检查实参是都指向当前对象的一个对象(...
  • daryl715
  • daryl715
  • 2007-02-27 17:08:00
  • 1336

asm字节码操作 方法的动态修改增加

asm 4.0 版本 http://forge.ow2.org/plugins/scmsvn/index.php?group_id=23   asm是java的字节码操作框架,可以动...
  • zhongweijian
  • zhongweijian
  • 2012-08-13 18:22:57
  • 7629

java asm 修改方法

1.实体类 package com.study.asm; public class Person { private String name; public void sayNam...
  • yyywyr
  • yyywyr
  • 2014-08-04 22:41:42
  • 6851

如何正确改写equals方法

本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。   在继承关系下的equals改写一文中,我简单介绍了Martin Odersky提出的canEqual方案,此...
  • darxin
  • darxin
  • 2010-03-06 07:23:00
  • 2285

java asm 添加属性

1、Person2.java package com.study.asm; public class Person2 { public String name = "yuanyi"; ...
  • yyywyr
  • yyywyr
  • 2014-08-04 22:40:45
  • 2462

使用ASM4.0实现AOP的功能,监控每个方法的执行时间

接之前的博客http://zhwj184.iteye.com/admin/blogs/1630756 关于asm使用的示例,这次使用asm来动态统计每个方法的执行时间,实现AOP功能。 AOP的...
  • zhongweijian
  • zhongweijian
  • 2012-08-15 13:11:17
  • 5561
收藏助手
不良信息举报
您举报文章:ASM 改写方法
举报原因:
原因补充:

(最多只允许输入30个字)