为什么80%的码农都做不了架构师?>>>   

ASM 判定一个类,实现了指定接口

技术支持

ASM 中,ClassReader 类:对已存在的进行解析,并提供获取类信息的方法。

通过 ClassReader ,实现对一个类的解析。

处理流程

依据如下流程,判断出一个类是否实现了某个接口:

  • 循环判断是否实现目标接口
  • 递归判断父接口是否存在目标接口
  • 递归判断父类是否实现目标接口

具体实现

具体实现代码如下 :

package utils;import org.objectweb.asm.ClassReader;import java.io.IOException;
import java.util.Set;/*** 判断某类是否实现了指定接口集合** @author pengpj* @date 2018/11/27*/
public class SpecifiedInterfaceImplementionChecked {/*** 判断是否实现了指定接口** @param reader       class reader* @param interfaceSet interface collection* @return check result*/public static boolean hasImplSpecifiedInterfaces(ClassReader reader, Set<String> interfaceSet) {if (isObject(reader.getClassName())) {return false;}try {if (containedTargetInterface(reader.getInterfaces(), interfaceSet)) {return true;} else {ClassReader parent = new ClassReader(reader.getSuperName());return hasImplSpecifiedInterfaces(parent, interfaceSet);}} catch (IOException e) {return false;}}/*** 检查当前类是 Object 类型** @param className class name* @return checked result*/private static boolean isObject(String className) {return "java/lang/Object".equals(className);}/*** 检查接口及其父接口是否实现了目标接口** @param interfaceList 待检查接口* @param interfaceSet  目标接口* @return checked result* @throws IOException exp*/private static boolean containedTargetInterface(String[] interfaceList, Set<String> interfaceSet) throws IOException {for (String inter : interfaceList) {if (interfaceSet.contains(inter)) {return true;} else {ClassReader reader = new ClassReader(inter);if (containedTargetInterface(reader.getInterfaces(), interfaceSet)) {return true;}}}return false;}}

测试用例

部分测试用例如下:

 private static Set<String> set;static {if (set == null) {set = new HashSet<>();}set.add("com/cvte/myou/apm/agent/utils/SpecifiedInterfaceImplCheckedTest$A");}@Testpublic void hasImplSpecifiedInterfacesTest() throws IOException {Assert.assertEquals(true, SpecifiedInterfaceImplChecked.hasImplSpecifiedInterfaces(new ClassReader(B.class.getName()), set));Assert.assertEquals(true, SpecifiedInterfaceImplChecked.hasImplSpecifiedInterfaces(new ClassReader(C.class.getName()), set));}@Testpublic void hasImplSpecifiedInterfacesObjectTest() throws IOException {Assert.assertEquals(false, SpecifiedInterfaceImplChecked.hasImplSpecifiedInterfaces(new ClassReader(Object.class.getName()), set));}@Testpublic void hasImplSpecifiedInterfacesInterfaceTest() throws IOException {Assert.assertEquals(true, SpecifiedInterfaceImplChecked.hasImplSpecifiedInterfaces(new ClassReader(D.class.getName()), set));}interface A {void hello();}class B implements A {@Overridepublic void hello() {}}abstract class C implements A {}interface D extends A {}

总结

ASM 中提供了 ClassReader ,对已存在的类进行解析,可以让我们在没有源码的情况下,对类进行操作。

转载于:https://my.oschina.net/pding/blog/2962373

ASM 判定一个类,实现了指定接口相关推荐

  1. C#判断一个类中有无指定名称的方法

    C#中可以通过反射分析元数据来解决这个问题,示例代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2 ...

  2. java电脑类的接口_java 一个类实现两个接口的案例

    直接用英文逗号分隔就可以了,比如:? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 inerface IHello { String sayHello ...

  3. Java判定一个数值是否在指定的开闭区间范围内

    对于开闭区间,在数学中的表示方式通常为 () 和 [],小括号代表开放区间,中括号代表封闭区间,而它们的区别主要在于是否包含 = 等于号,开闭区间通常会分为以下一些情形: (1, 10):代表 1 & ...

  4. Java开发规范,不要新建一个类就实现Serializable接口

    个人网站:http://xiaocaoshare.com/ 作为一名java开发者,细节决定技术的高度和深度 一个java类什么时候需要实现Serializable接口 1.什么是Serializab ...

  5. java接口有非抽象方法_如果一个类没有实现Java接口的所有抽象方法,会发生什么?...

    Java中的接口类似于类,但是它只包含final和static的抽象方法和字段. 在单独的类中,您需要实现此接口并为其所有抽象方法提供主体. 使用类实现接口后,必须向其所有抽象方法提供主体(实现),或 ...

  6. java一个类添加多个接口_Java的一个类可以实现多个接口。

    Java的一个类可以实现多个接口. 答:√ 下列原始凭证中属于一次凭证的有( ). 答: 收据 收料单 完全角化细胞在显微镜下不可能出现的颜色是 答:白色 In a language classroo ...

  7. 一个类实现多个接口的demo

    //A接口 interface A{public int getA(); } //B接口 interface B{public int getB(); } //实现了某个接口必须实现其全部的方法 pu ...

  8. Java反射机制demo(四)—获取一个类的父类和实现的接口

    2019独角兽企业重金招聘Python工程师标准>>> Java反射机制demo(四)-获取一个类的父类和实现的接口 1,Java反射机制得到一个类的父类 使用Class类中的get ...

  9. java类接口实验_实验3_Java类的继承和接口的定义和使用

    本次有三题:学会Java类的继承.接口的定义和使用 // Ex3_1.java /** * 题目要求: * 修改例5.7(P95)实现在页面中拖动鼠标画出矩形,矩形的对角线为点击并拖动鼠标形成的直线线 ...

最新文章

  1. c# 带返回值的action_C#知识点讲解之C#delegate、event、Action、EventHandler的使用和区别...
  2. 玩转数据结构从入门到进阶四
  3. HTML5前端常见攻击方式案例讲解!
  4. kylin如何支持flink_Kylin 在腾讯的平台化及 Flink 引擎实践
  5. vue 表单 验证 async-validator
  6. Python 元组(Tuple)操作详解
  7. C# web项目中sql数据库转sqlite数据库
  8. Python 字符串语法,for
  9. Windows学习总结(13)——各品牌电脑进入BIOS按键汇总
  10. JavaScript学习(三十二)— Keycode常用键位码对照表
  11. Illustrator 教程,了解路径和曲线
  12. vi+ctags 阅读源码
  13. qs.stringify()详情
  14. python调用大漠插件、检测么_Python调用大漠插件
  15. rosbag使用方法汇总
  16. oracle dbca没有,ORACLE 使用DBCA静默创建数据库
  17. 射频电路板设计常见的问题分析和解决办法
  18. 数据结构之数据、数据元素、数据项、数据对象之间的关系
  19. 烂泥:OpenLDAP安装与配置
  20. 清除浮动的常用几种方式

热门文章

  1. android上传图片文件至c 服务器,Android 史上最优雅的实现文件上传、下载及进度的监听...
  2. 子窗体中组合框联动_一张表实现组合框联动
  3. Java操作——获取文件扩展名,去掉文件扩展名
  4. redis 哨兵 异步_突破Java面试(23-8) - Redis哨兵主备切换的数据丢失问题-阿里云开发者社区...
  5. Linux | 编译原理、gcc的命令参数、自动化构建工具 make/Makefile
  6. sizeof运算符运算结果小汇
  7. C++(3)--编译、gdb调试
  8. python递归算法案例教案_python教案
  9. 火狐浏览器添加MetaMask钱包和本地开启私有链开发
  10. IT人的好习惯和不良习惯总结