java 找出调用的方法_如何找到用Java调用给定方法的所有方法?
小编典典
为了分析字节码,我建议使用ASM。给定要分析的类列表,可以使访问者找到您感兴趣的方法调用。下面是一个分析jar文件中类的实现。
请注意,ASM使用带有’/’而不是’。的internalNames。作为分隔符。将目标方法指定为不带修饰符的标准声明。
例如,列出在Java运行时jar中可能正在调用System.out.println(“ foo”)的方法:
java -cp "classes;asm-3.1.jar;asm-commons-3.1.jar" App \
c:/java/jdk/jre/lib/rt.jar \
java/io/PrintStream "void println(String)"
编辑:添加了源代码和行号:请注意,这仅指示每个调用方法的最后一个目标方法调用-原始q只想知道哪些方法。我将其作为练习供读者显示调用方法声明的行号或每个目标调用的行号,具体取决于您实际要执行的操作。:)
结果是:
LogSupport.java:44 com/sun/activation/registries/LogSupport log (Ljava/lang/String;)V
LogSupport.java:50 com/sun/activation/registries/LogSupport log (Ljava/lang/String;Ljava/lang/Throwable;)V
…
Throwable.java:498 java/lang/Throwable printStackTraceAsCause (Ljava/io/PrintStream;[Ljava/lang/StackTraceElement;)V
–
885 methods invoke java/io/PrintStream println (Ljava/lang/String;)V
资源:
public class App {
private String targetClass;
private Method targetMethod;
private AppClassVisitor cv;
private ArrayList callees = new ArrayList();
private static class Callee {
String className;
String methodName;
String methodDesc;
String source;
int line;
public Callee(String cName, String mName, String mDesc, String src, int ln) {
className = cName; methodName = mName; methodDesc = mDesc; source = src; line = ln;
}
}
private class AppMethodVisitor extends MethodAdapter {
boolean callsTarget;
int line;
public AppMethodVisitor() { super(new EmptyVisitor()); }
public void visitMethodInsn(int opcode, String owner, String name, String desc) {
if (owner.equals(targetClass)
&& name.equals(targetMethod.getName())
&& desc.equals(targetMethod.getDescriptor())) {
callsTarget = true;
}
}
public void visitCode() {
callsTarget = false;
}
public void visitLineNumber(int line, Label start) {
this.line = line;
}
public void visitEnd() {
if (callsTarget)
callees.add(new Callee(cv.className, cv.methodName, cv.methodDesc,
cv.source, line));
}
}
private class AppClassVisitor extends ClassAdapter {
private AppMethodVisitor mv = new AppMethodVisitor();
public String source;
public String className;
public String methodName;
public String methodDesc;
public AppClassVisitor() { super(new EmptyVisitor()); }
public void visit(int version, int access, String name,
String signature, String superName, String[] interfaces) {
className = name;
}
public void visitSource(String source, String debug) {
this.source = source;
}
public MethodVisitor visitMethod(int access, String name,
String desc, String signature,
String[] exceptions) {
methodName = name;
methodDesc = desc;
return mv;
}
}
public void findCallingMethodsInJar(String jarPath, String targetClass,
String targetMethodDeclaration) throws Exception {
this.targetClass = targetClass;
this.targetMethod = Method.getMethod(targetMethodDeclaration);
this.cv = new AppClassVisitor();
JarFile jarFile = new JarFile(jarPath);
Enumeration entries = jarFile.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
if (entry.getName().endsWith(".class")) {
InputStream stream = new BufferedInputStream(jarFile.getInputStream(entry), 1024);
ClassReader reader = new ClassReader(stream);
reader.accept(cv, 0);
stream.close();
}
}
}
public static void main( String[] args ) {
try {
App app = new App();
app.findCallingMethodsInJar(args[0], args[1], args[2]);
for (Callee c : app.callees) {
System.out.println(c.source+":"+c.line+" "+c.className+" "+c.methodName+" "+c.methodDesc);
}
System.out.println("--\n"+app.callees.size()+" methods invoke "+
app.targetClass+" "+
app.targetMethod.getName()+" "+app.targetMethod.getDescriptor());
} catch(Exception x) {
x.printStackTrace();
}
}
}
```
2020-09-27
java 找出调用的方法_如何找到用Java调用给定方法的所有方法?相关推荐
- java 4位数,java 找出4位数的所有吸血鬼数字
java 找出4位数的所有吸血鬼数字 /** * 找出四位数所有的吸血鬼数字 * 吸血鬼数字:位数为偶数的数字可以由一对数字相乘而得,这对数字包含乘积一半的位数 * 如:1260 = 21*60 */ ...
- java怎么找出数组最小值,Java找出数组的最小值元素
Java找出数组的最小值元素 1 说明 在此程序中,我们需要找出数组中存在的最小元素.这可以通过保持变量min来实现,该变量起初将保留第一个元素的值.通过将min的值与数组的元素进行比较来遍历数组.如 ...
- java找出两个字符串中所有共同的子串_【Java笔记】
Leetcode 1.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是, ...
- main方法_你知道为什么Java的main方法必须是public static void?
来源:http://suo.im/6v9d64 Main 方法是我们学习 Java 编程语言时知道的第一个方法,你是否曾经想过为什么 main 方法是 public.static.void 的.当然, ...
- java为属性提供访问器方法_关于继承:Java不继承访问器方法吗?
给定一个扩展了实现接口" DeeDum"的类" Foo"的类" Bar" public interface DeeDum { public ...
- 调用父级方法_通信:找到任意组件实例的findComponents系列方法,5个终极方案
已经介绍了两种组件间通信的方法:provide / inject 和 dispatch / broadcast.它们有各自的使用场景和局限,比如前者多用于子组件获取父组件的状态,后者常用于父子组件间通 ...
- main方法_十个经典的 Java main 方法面试题
以下是笔者认为比较经典的关于Java main方法的面试题,与其说是Java面试题,其实也是Java的一些最基础知识问题,分享给大家,如有错误,请指出. 1.不用main方法如何定义一个类? 不行,没 ...
- java路由方法_路由选择算法的JAVA实现.doc
路由选择算法的JAVA实现 路由选择算法的JAVA实现 第15卷第7期电脑开发与应用 路由选择算法的JAVA实现 JAVAImplementationofRouterSelectionAlgorith ...
- java 找出姓“张”的学生,将他们的信息写入第二个文件
一.需求 编写一个Java源程序,其中包含: 编写一个包含主方法main的公共类(访问权限为public的类),主方法main中完成的任务是: (1)从键盘上输入两个文件的路径名及其文件名. (2)从 ...
最新文章
- 腾讯云python环境_腾讯云centos6.5 搭建python机器学习环境
- 【linux回炉 档案权限与目录配置】
- android错误-android.util.AndroidRuntimeException:You cannot combine custom titles with other title
- 单独运行shell脚本与crontab运行shell脚本的区别
- iphonex黑屏开不了机_手机突然黑屏开不了机充电没反应怎么办?别急,这样就可以解决...
- pandas 根据单号分类_由 “猫捉老鼠”游戏联想的用户分类问题
- 如何加快数据库查询速度
- java实现一个简单的登录界面
- HDU1880 魔咒词典【文本处理】
- 【渝粤教育】国家开放大学2018年秋季 2245T社会福利与保障 参考试题
- Spoon工具使用(kettle进行实时同步数据)
- 计算机上找不到运行程序怎么办,电脑联网时显示找不到应用程序怎么办
- 【已失效】创维DT741-csf光猫管理员/root超级密码获取方法
- 【电脑自检后无法进入电脑系统的搞定妙方】
- 2022年烟花爆竹经营单位安全管理人员培训试题及模拟考试
- 联想台式计算机亮度怎么调,Lenovo笔记本电脑如何调节屏幕亮度
- android studio anr,Android ANR 分析
- 未来5年到底是做什么生意最好?
- 机器学习中的L1和L2正则化项
- 信号完整性分析学习--13--IBIS模型(2)
热门文章
- Vivado设计流程(二)设计文件输入
- 突击计划——给定三角形边长,求面积
- 敏捷开发“松结对编程”实践之五:代码检查篇(大型研发团队,学习型团队,139团队,师徒制度,代码审查)...
- 敏捷开发免费管理工具——火星人预览之一:需求与故事树
- Exception 'ReflectionException' with message 'Class require does not exist'
- C++内存管理(转)http://www.cnblogs.com/qiubole/archive/2008/03/07/1094770.html
- loadrunner 商城项目随机选书
- Django Rest Framework源码剖析(七)-----分页
- linux 常用指令汇总
- POST提交数据之---Content-Type的理解;