java ASM动态生成类
BeanTest2.java
import java.io.FileOutputStream; import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes; public class BeanTest2 extends ClassLoader implements Opcodes{ public static void main(String []args) throws Exception
{
ClassWriter cw = new ClassWriter(0);
//类名
cw.visit(V1_7, ACC_PUBLIC, "com/xxx/model/_766ComLeakInfo", null, "com/xxx/model/LeakInfo", null);
//注释
AnnotationVisitor av = cw.visitAnnotation("Lorg/springframework/data/mongodb/core/mapping/Document;", true);
//注释参数
av.visit("collection", "uc_members");
av.visitEnd();
//构造函数
MethodVisitor mw = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null,null);
mw.visitVarInsn(ALOAD, 0);
mw.visitMethodInsn(INVOKESPECIAL, "com/xxx/model/LeakInfo", "<init>", "()V");
mw.visitInsn(RETURN);
mw.visitMaxs(1, 1);
mw.visitEnd(); //字段
FieldVisitor fv = cw.visitField(ACC_PUBLIC, "description", "Ljava/lang/String;", null, null);
fv.visitEnd(); byte[] code = cw.toByteArray(); //将二进制流写到本地磁盘上
FileOutputStream fos = new FileOutputStream("E:/asm/bin/com/xxx/model/_766ComLeakInfo.class");
fos.write(code);
fos.close(); BeanTest2 loader = new BeanTest2();
Class<?> clazz = loader.defineClass(null, code, 0, code.length);
Object beanObj = clazz.getConstructor().newInstance(); clazz.getField("description").set(beanObj, "Adobe客户信息泄露!"); String nameString = (String) clazz.getField("description").get(beanObj);
System.out.println("filed value : " + nameString);
}
}
LeakInfo.java
import java.io.Serializable;
import org.springframework.data.mongodb.core.mapping.Document;
@SuppressWarnings("serial")
@Document
public class LeakInfo implements Serializable{
//@Id
long id;
String type;
String username;
String email;
String password;
String source;
String description;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
生成类
import org.springframework.data.mongodb.core.mapping.*; @Document(collection = "uc_members")
public class _766ComLeakInfo extends LeakInfo
{
public String description;
}
java ASM动态生成类的更多相关文章
- 【原】如何获取Java动态生成类?
写作目的:Java大部分框架,如Spring,Hibernate等都会利用动态代理在程序运行的时候生成新的类, 有的时候为了学习,或者深入了解动态代理,想查看动态生成类的源代码究竟长怎么个样子, 通过 ...
- Java动态生成类以及动态添加属性
有个技术实现需求:动态生成类,其中类中的属性来自参数对象中的全部属性以及来自参数对象properties文件. 那么技术实现支持:使用CGLib代理. 具体的实现步骤: 1.配置Maven文件: &l ...
- Roslyn 编译器Api妙用:动态生成类并实现接口
在上一篇文章中有讲到使用反射手写IL代码动态生成类并实现接口. 反射的妙用:C#通过反射动态生成类型继承接口并实现 有位网友推荐使用 Roslyn 去脚本化动态生成,今天这篇文章就主要讲怎么使用 Ro ...
- JDK 工具 HSDB 查看动态生成类
前置工作 1. 复制 JDK 安装目录\jre\bin\sawindbg.dll 到 JDK 安装目录同级的 jre\bin 目录下,否则会报错找不到 sawindbg.dll 文件. 比如我的 sa ...
- 使用RetionalRose根据现有的java工程逆向生成类图
1.进入RetionalRose选择J2EE模板 2.在菜单栏选择tools->java/j2EE->reverse engineer 3.编辑路径Edit CLASSPATH选择要生成类 ...
- java 动态生成类再编译最后代理
package spring.vhostall.com.proxy; public interface Store { public void sell(); } ------------------ ...
- C# 动态生成类 枚举等
private void GenerateCode() { /*注意,先导入下面的命名空间 using System.CodeDom using System.CodeDom.Compiler; us ...
- java后台动态生成导出excel
p ublic void export(List<WechatUser> wechatUserList, HttpServletResponse response) throws IOEx ...
- Java ASM 技术简介
什么是ASM ASM 是一个 Java 字节码操控框架.它能被用来动态生成类或者增强既有类的功能.ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为. ...
随机推荐
- Eclipce 配置javaEE
Eclipse 安装JavaEE插件 Oxygen版Eclipse 导入项目会自动安装你项目需要的一些插件,但是有时候会安装失败,需要手动安装: 这里以Dynamic Web Project项目为 ...
- 如何安装和配置RabbitMQ(转载)
如何安装和配置RabbitMQ 今天开始一个小小的练习,学习一下安装和配置RabbitMQ,为什么要学它,因为WCF可以完全兼容和使用RabbitMQ了.我们新的大数据系统需要使用消息队列,所以就开始 ...
- SimpleDateFormat 使用时出现的线程同步问题。。。
错误使用: public static final SimpleDateFormat DAY_UI_MONTH_DAY_FORMAT = new SimpleDateFormat("MM-d ...
- Win2012 R2虚拟机自激活(AVMA)技术
只要你的宿主机是Windows Server 2012 R2 Datacenter且宿主机已经激活, 不管宿主机许可证是VL,OEM还是零售版,只要宿主主机处于激活状,在其上运行的任何R2 VM都将被 ...
- HTML 视频
在html5中使用视频,只要添加元素<video></video>元素表示. <video>有几个属性: src 指定音频文件的路径 poster 视频播放之前显示 ...
- &符号 (弃用引用传参了,不要用!!)
写法一 $age = function grow($age) { $age += ; return $age; } echo grow($age) echo $age 写法二 $age = funct ...
- Html----编写
文档的编辑 选择文档---->修改文档后缀名(.thml)--->用浏览器打开(解释和执行HTML源代码的工具) 浏览器主要分类及内核 火狐(Firefor)--->Gecho IE ...
- JAVA集合操作异常 ---------Collections.unmodifiableCollection
1.问题原因 这两天在做开发的时候,在一个首页的列表哪里操作了ArrayList集合,在做递归删除的时候用的是Iterator对象(至于为什么用,来个链接https://blog.csdn.net/m ...
- linux基本之一
1.目录棉集 / 根目录,理论上讲系统中的一切都属于他. /bin 存放所有用户都能执行的命令(二进制) /boot 存放启动文件/内核的相关文件,一般独立成为一个分区. /dev 存放物理设备的目录 ...
- pandas 常用清洗数据(一)
数据源获取: https://www.kaggle.com/datasets 1. Look at the some basic stats for the ‘imdb_score’ column: ...