public static void strongClass() throws Exception{
String myPath = "file:/D:/test/class/MyMain.class";
System.out.println(myPath);
byte[] cLassBytes = null;
Path path = null;
try {
path = Paths.get(new URI(myPath));
cLassBytes = Files.readAllBytes(path);
System.out.println("========bytes size =======" + cLassBytes.length);
//spring asm的包
ClassReader cr = new ClassReader(cLassBytes);
jdk.internal.org.objectweb.asm.ClassReader jcr = new jdk.internal.org.objectweb.asm.ClassReader(cLassBytes);
//jdk rt.jar中的包
ClassNode cn = new ClassNode();
jcr.accept(cn,0);
List<FieldNode> fields = cn.fields;
//spring asm的包
ClassWriter cw = new ClassWriter(cr,ClassWriter.COMPUTE_MAXS);
cr.accept(cw, Opcodes.ASM5);
MethodVisitor mv = null;
for(FieldNode n : fields){
String fieldName = n.name;
String typeOf = n.desc;
System.out.println(typeOf);
// getMethod StringUtils也是用spring core中的工具包
String getMethodName = "get" + StringUtils.capitalize(fieldName);
//第一个参数是方法的访问权限(public,private等)
//第二个参数是方法名(<init>是构造函数的)
//第三个参数是返回类型(()V是没有返回值)
//第四个参数是和泛型相关的, 这里传入null表示该方法不是泛型方法
//第五个参数指定方法声明可能抛出的异常。 这里无异常声明抛出
mv = cw.visitMethod(ACC_PUBLIC, getMethodName, "()" + typeOf, null, null);
//生成方法中的代码
mv.visitCode();
//调用visitVarInsn方法,生成aload指令, 将第0个本地变量(也就是this)压入操作数栈。
mv.visitVarInsn(ALOAD, 0);
//调用visiFieldInsn是将属性压入栈
mv.visitFieldInsn(GETFIELD, "MyMain", fieldName, typeOf);
//调用visitInsn方法,生成return指令, 方法返回
mv.visitInsn(loadAndReturnOf(typeOf)[1]);
//调用visitMaxs方法, 指定当前要生成的方法的最大局部变量和最大操作数栈
mv.visitMaxs(2, 1);
//最后调用visitEnd方法, 表示当前要生成的构造方法已经创建完成
mv.visitEnd();
String setMethodName = "set" + StringUtils.capitalize(fieldName);
mv = cw.visitMethod(ACC_PUBLIC, setMethodName, "(" + typeOf + ")V", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(loadAndReturnOf(typeOf)[0], 1);
mv.visitFieldInsn(PUTFIELD, "MyMain", fieldName, typeOf);
mv.visitInsn(RETURN);
mv.visitMaxs(3, 3);
mv.visitEnd();
}
byte[] bs = cw.toByteArray();
cLassBytes = bs;
System.out.println("========bytes size =======" + bs.length + cLassBytes.length);
FileOutputStream fos = new FileOutputStream("E:/daemon1/MyMain.class");
fos.write(cLassBytes);
fos.flush();
fos.close();
} catch (IOException | URISyntaxException e) {
e.printStackTrace();
}
// Class clz = new SynamicCompiler().defineClass("MyMain", cLassBytes, 0, cLassBytes.length);
// Method method = clz.getMethod("getRedisUtil");
// Method setMethod = clz.getMethod("setRedisUtil",RedisUtil.class);
// Object obj = clz.newInstance();
// setMethod.invoke(obj,new RedisUtil());
// RedisUtil redisUtil = (RedisUtil) method.invoke(obj);
// System.out.println(redisUtil);
// Thread.sleep(5000);
}
//返回的都是字节码的指令,需要清楚字节码
private static int[] loadAndReturnOf(String typeof) {
System.out.println(typeof+"==??");
if (typeof.equals("I") || typeof.equals("Z")) {
return new int[]{ILOAD, IRETURN};
} else if (typeof.equals("J")) {
return new int[]{LLOAD, LRETURN};
} else if (typeof.equals("D")) {
return new int[]{DLOAD, DRETURN};
} else if (typeof.equals("F")) {
return new int[]{FLOAD, FRETURN};
} else {
return new int[]{ALOAD, ARETURN};
}
}
分享到:
相关推荐
ASM操作字节码,动态生成Java类class文件,模拟Spring的AOP实现原理。
ASM Java字节码操作框架PPT,结合已有AOP实现方法,对比所有对Java字节码操作方法做比较
一个简单的通过ASM修改字节码实现AOP功能的实例,简单易懂,可运行...
字节码生成库是生成和转换java字节码的高级api。
埋点计时Gradle插件,利用ASM插入字节码,对指定包名内的类或指定注解的方法,打印其方法的耗时时间。
ASM 4 的中文文档 网上的博文都是从这上边摘得,大家下载下来学学就会了,这个是最全的了。我就是通过这个学会的。
主要给大家介绍了关于java字节码框架ASM如何操作字节码的相关资料,文中通过示例代码介绍的很详细,有需要的朋友可以参考借鉴,下面来一起看看吧。
Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至...
ASM 帮助文档(java字节码操作) 对字节码进行操作的jar包。
spring 3.2.5版本源码使用的,构建的时候使用如下描述 因为英文不太好,大概意思可能是什么asm4.0版本使用的spring 在spring4中已经重新包装了asm在spring-core的核心包里,当然我这解释不标准 看下满原文构建的描述...
使用 ASM 从 Java 字节码生成控制流图 作者 佩纳安东尼 布朗丁·尼古拉斯 巴登·杰里米 要求 已安装 开发商 您必须位于项目文件夹(pom.xml 文件所在的位置)才能使用以下命令进行编译: mvn compile 然后运行项目...
这是spring-asm-3.1.0.RELEASE.jar,为了使用方便传上来.
ASM是一套java字节码生成架构,它可以动态生成二进制格式的stub类或其它代理类, 或者在类被java虚拟机装入内存之前,动态修改类。 现在挺多流行的框架都使用到了asm.所以从aop追溯来到了这。
Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至...
在ASM中提供了诸多的API用于对类的内容进行字节码操作的方法。与传统的BCEL和SERL不同,在ASM中提供了更为优雅和灵活的操作字节码的方式。ASM相当小巧,并且它有更高的执行效率,是BCEL的7倍,SERP的11倍以上。目前...
内容包含ASM4.0中文手册,以及四种ASM常见的字节码操作应用范例,包含最新版本的ASM9.2的jar包,包含asm-9.2.jar,asm-commons-9.2.jar,asm-util-9.2.jar。 学习文章地址 ...
org.springframework.asm-3.0.5.RELEASE.jar
Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至...
LargeImageMonitor是一个使用ASM进行字节码插桩的大图监控框架,可以对我们要加载的图片进行监控,如果出现图片超过阈值的情况会进行报警。 功能与特点 1.支持Glide,Fresco,Picasso,Universal Image Loader。 2....
NULL 博文链接:https://xpenxpen.iteye.com/blog/2194267