asm是一款很优秀的操作java字节码的框架,专注于性能,是实现Aop的一大利器,spring中的cglib中的cglib就是使用的asm来完成aop的功能。
asm中有两种操作字节码的方式,一种是基于事件模型,一种是树模型(对象)。基于事件模型中有几个很核心的类,例如ClassReader,ClassWriter,ClassVisitor。读取一个类的字节码文件,需要使用ClassReader,创建一个类的字节码文件,需要使用ClassWriter,对一个类进行修改需要使用ClassVisitor,通过观察模式进行改变。
先来一个读取类的字节码文件的例子。
pom中引入asm的依赖
<!-- https://mvnrepository.com/artifact/org.ow2.asm/asm -->
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>5.0.4</version>
</dependency>
要读取的类Test
public class Test {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
读取程序
public class ClassPrinter extends ClassVisitor {
public ClassPrinter() {
super(ASM4);
}
@Override
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
System.out.println(name+" extend "+superName +" implements "+interfaces);
}
@Override
public FieldVisitor visitField(int access, String name, String descriptor, String signature, Object value) {
System.out.println(" "+descriptor+" "+name);
return null;
}
@Override
public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {
System.out.println(" "+name+descriptor);
return null;
}
public static void main(String[] args) throws IOException {
ClassPrinter classPrinter=new ClassPrinter();
InputStream cl=ClassLoader.getSystemResourceAsStream(Test.class.getName().replace(".","/")+".class");
ClassReader classReader=new ClassReader(cl);
classReader.accept(classPrinter,0);
}
}
输出
com/example/demo/util/Test extend java/lang/Object implements [Ljava.lang.String;@b4c966a
Ljava/lang/Integer; id
Ljava/lang/String; name
<init>()V
getId()Ljava/lang/Integer;
setId(Ljava/lang/Integer;)V
getName()Ljava/lang/String;
setName(Ljava/lang/String;)V
简介随着业务的增长,osd中数据很多,如果db或者wal设备需要更换,删除osd并且新建osd会引发大量迁移。本文主要介绍需要更换db或者wal设备时(可能由于需要更换其他速度更快的ssd;可能时这个db的部分分区损坏,但是db或者wal分区完好,所以需要更换),如何只更换db或者wal设备,减少数据迁移(不允许db或者wal设备容量变大或者变小).具体步骤如下:设置osd noout ,停止相应osd[[email protected] ~]# ceph osd set nooutnoout is
前言:我用过多款linux系统,电脑上装的是Ubuntu和deepin,服务器端用的是centos,还用过优麒麟等。黑苹果也用了一段时间。现在linux系统已经发展的比较完善,内核及其图形界面也很稳定,当要说真的可以当做个人操作系统来使用的,我认为是deepin系统。deepin是一款国产系统,基于debian开发的linux操作系统,它拥有linux系统的所有优势,而且完美结合deepin-...
腾讯云服务器自动断开连接的解决办法1、找到sshd_config配置文件打开并进行编辑,输入命令:vim /etc/ssh/sshd_config在此文件中找到以下配置项:# ClientAliveInterval 0# ClientAliveCountMax 3去掉注释,改为:ClientAliveInterval 30ClientAliveCountMax 86400这两行的意思是:1、服务端每隔多少秒向客户端发送一个心跳数据2、客户端多少次没有相应,服务器自动断掉连接
def outPut(vecFile:str,idFiled:str,vecSR,centers:list): shpDriver=ogr.GetDriverByName('ESRI Shapefile') outPutPath=vecFile.replace('.shp','_center.shp') centerDS=ogr.Driver.CreateDataSource(shpDriver,outPutPath) centerLay=ogr.DataSource.Cre
现代摩比斯目前正致力于在中国构建从企划到研发、生产及品质控制的产品开发全过程的本地化应对体系,今后将进一步强化本地特色化经营,从而加速抢占本地整车企业市场。中国国际进口博...
前言:好早之前看到的一个逻辑题:有两个2到99之间的整数,a知道这两个数的和,b知道这两个数的积。第一句:a对b说:我不知道这两个数是多少,但我确信你也不知道。第二句:b说:我知道了。第三句:a说:我也知道了。问这两个数是多少? 题不难,只是手动去找没有python写程序找的快,而且用python程序可以在后面进行进一步的探索。分析:首先是a手上的数是两个数的和,那是在[4,198]之间。第一句话...
如何在Intellij idea中像Eclipse一样再调用方法时出现方法的注释?效果图如下设置步骤如下:file-settings-Editor-General-CodeCompletion->勾选上Auto-displaydocumentation选项即可此方法适用于Intellij idea2018版 其他版本可以参考https://blog.csdn.net...
在我们的手机中难免会有一些隐私应用不想被别人看到。这时我们可以对该软件进行应用隐藏。那具体该怎么操作呢?不要着急换换早就为大家准备好了iqooneo5应用隐藏的详细方法。快来接着往下看看吧!iqooneo5隐藏应用方法分享1、打开手机设置。点击【指纹、面部与密码】。2、点击【隐私与应用加密】。设置好隐私密码。3、点击【应用隐藏】。4、开启需要隐藏应用的开关即可。...
typora笔记
第一步: 找到SlidingMenu库中CustomViewBehind 类 添加如下代码:private float mOffsetFadeDegree; //剩余的view 淡出淡入,就是从界面从黑到透明public void setOffsetFadeDegree(float degree) { if (degree > 1.0f || degree < 0.0f) throw new IllegalStateException("Th...
1、题目描述:2、题解:方法1:递归Python实现:# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def inorderTraversal(self, root: TreeNode
这两天为RDLC报表横向放纸不能横向打印问题解决搞得焦头烂额。现在做个总结,给欠缺这方面经验的博友们提供点有益的参考,希望大家能少走弯路。文章目录问题由来1. RDLC设计2. 创建打印机纸张类型3. 设置打印首选项的打印纸原因解决办法1. 遵守RDLC的纵横向强制规则(本次采用办法)2. 逆转RDLC的纵横向强制规则:旋转打印3. 放弃RDLC打印方案(略。。。)问题由来这次做了一个医院的住院发票打印。发票大小跟普通发票一样,尺寸是21cm×14cm 跟A5(21cm×14.5cm)很接近..