本节课主要实现目标:使用ASM技术查找实现指定接口的Class类
- 初步代码实现
- 运行效果查看
- ASM技术简单讲解
初步代码实现
- 指定的接口
package com.billy.app_lib_interface;
/**
* @author billy.qi
* @since 17/9/21 19:05
*/
public interface ICategory {
String getName();
}
String interfaceName = "com/billy/app_lib_interface/ICategory"
- 指定接口定义
String interfaceName = "com/billy/app_lib_interface/ICategory"
- ASM相关APi调用
private void asmScanClass(InputStream inputStream, String filePath){
ClassReader cr=new ClassReader(inputStream)
ClassWriter cw=new ClassWriter(cr,0)
BiliScanClassVisitor cv=new BiliScanClassVisitor
(Opcodes.ASM5,cw,filePath)
cr.accept(cv, ClassReader.EXPAND_FRAMES)
inputStream.close()
}
class BiliScanClassVisitor extends ClassVisitor{
private String filePath
BiliScanClassVisitor(int api, ClassVisitor cv, String filePath) {
super(api, cv)
this.filePath = filePath
// project.logger.error('init---ScanClassVisitor')
}
@Override
void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
super.visit(version, access, name, signature, superName, interfaces)
project.logger.error('version:'+version+" access:"+access+" name:"+name+" signature:"+signature+" superName:"+superName+" interfaces:"+interfaces)
interfaces.each {itName->
if(itName==interfaceName){
project.logger.error('this class is our class:'+name)
}
}
}
}
运行效果

image.png
ASM技术简单讲解
private void asmScanClass(InputStream inputStream, String filePath){
ClassReader cr=new ClassReader(inputStream)
ClassWriter cw=new ClassWriter(cr,0)
BiliScanClassVisitor cv=new BiliScanClassVisitor
(Opcodes.ASM5,cw,filePath)
cr.accept(cv, ClassReader.EXPAND_FRAMES)
inputStream.close()
}
- ASM相关技术资料
ASM官网地址
参考资料1
参考资料2 - 基础Api讲解
1、ClassReader :按照Java虚拟机规范中定义的方式来解析class文件中的内容,在遇到合适的字段时调用ClassVisitor中相对应的方法。
2、ClassWriter用于“编写”,即创建和修改类。注意ClassWriter继承了ClassVisitor。
3、ClassVisitor:java中类的访问者,提供一系列方法由ClassReader调用。是一个抽象类,我们在使用的时候需要继承此类。使用此对象的时候需要指定asm api的版本。 -
原理图
9d4c64a4fba74feeadf5403a2cf48b46.png
