ASM 改写方法
来源:互联网 发布:小仙女的网络用语意思 编辑:程序博客网 时间:2024/05/17 07: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 改写方法
- 改写方法
- 弹窗方法改写
- 怎样正确改写Equals方法
- 怎样正确改写Equals方法
- 如何正确改写equals方法
- C#改写方法学习笔记
- String的equals方法改写
- java asm 修改方法
- 全外连接的union改写方法
- 改写equals与hashCode的简单方法
- 用UFLDL的方法改写Denoising Autoencoder
- 灵活运用runtime改写系统的方法
- 改写中断例程的方法(1504)
- 改写CNN网络的一些问题解决方法
- asm
- ASM
- asm
- Android 侦听Usb或者SDCard热拔插事件
- 好东西: Chrome 浏览收藏夹同步
- python中eval, exec, execfile,和compile [转载]
- 走进Zend Framework框架编程(四):Zend_Controller和引导文件
- Synergy/CM总结
- ASM 改写方法
- Android使用
- 解决StarDict没有词库问题
- Xcode错误:putpkt: write failed, broken pipe解决办法
- C++ 优先级
- DudaMobile推出自己的移动版
- 广播的注册与注销
- use wizards framework
- how to start a new goal