- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想列出一个方法调用的所有方法。
void create() throws MyException {
System.out.println("TEST");
of("String").map(String::valueOf).get();
}
在这个方法中我想列出
我已经习惯了以下代码,来自 how to find all methods called in a method?
public class MethodFinder {
public static void main(String[] args) throws Throwable {
ClassPool cp = ClassPool.getDefault();
CtClass ctClass = cp.get("MyClass");
CtMethod method = ctClass.getDeclaredMethod("getItem1");
method.instrument(
new ExprEditor() {
public void edit(MethodCall m)
throws CannotCompileException
{
System.out.println(m.getClassName() + "." + m.getMethodName() + " " + m.getSignature());
}
});
}
}
并获取除 String::valueOf 之外的所有方法
是否可以通过任何其他框架解决这个问题并不重要。
最佳答案
由于 String.valueOf
实际上并未由该方法调用,因此我会使用更广泛的术语,例如谈论引用方法,其中包括调用的方法。使用ASM收集所有这些的一种方法( java-bytecode-asm ) 是:
import java.io.IOException;
import java.util.Optional;
import org.objectweb.asm.*;
public class FindAllReferencedMethods {
class Example {
void create() {
System.out.println("TEST");
Optional.of("String").map(String::valueOf).get();
}
}
public static void main(String[] args) throws IOException {
ClassReader r = new ClassReader(Example.class.getName());
r.accept(new ClassVisitor(Opcodes.ASM5) {
@Override
public MethodVisitor visitMethod(
int access, String name, String desc, String sig, String[] ex) {
return name.equals("create")? new MethodRefCollector(): null;
}
}, ClassReader.SKIP_DEBUG|ClassReader.SKIP_FRAMES);
}
static void referencedMethod(String owner, String name, String desc) {
System.out.println(
Type.getObjectType(owner).getClassName() + "." + name + " " + desc);
}
static class MethodRefCollector extends MethodVisitor {
public MethodRefCollector() {
super(Opcodes.ASM5);
}
@Override
public void visitMethodInsn(
int opcode, String owner, String name, String desc, boolean itf) {
referencedMethod(owner, name, desc);
}
@Override
public void visitInvokeDynamicInsn(
String name, String desc, Handle bsm, Object... bsmArgs) {
if(bsm.getOwner().equals("java/lang/invoke/LambdaMetafactory")
&& bsm.getDesc().equals(bsm.getName().equals("altMetafactory")?
ALT_SIG: MF_SIG)) {
Handle target = (Handle)bsmArgs[1];
referencedMethod(target.getOwner(), target.getName(), target.getDesc());
}
}
}
static String MF_SIG = "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;"
+"Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/"
+"MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;";
static String ALT_SIG = "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;"
+"Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;";
}
关于java - 如何查找方法中调用的所有方法(包括 Lamda)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47075009/
zeta 在 critic 方法中代表什么?我相信它会跟踪状态- Action 对并表示资格跟踪,这是状态- Action 的临时记录,但 zeta 究竟代表什么以及它在 C++ 中的外观如何(例如
我想列出一个方法调用的所有方法。 void create() throws MyException { System.out.println("TEST"); of("String")
所以我只是在玩 kotlin,无法解决这个问题。 fun itsAfunction() = 10 fun check(function:()->Int):Int{ re
想知道是否可以让网络应用程序将文件 (userid.input.json) 上传到 Amazon S3,这会触发一个 lambda 函数来读取文件、进行一些处理并保存结果作为另一个 (userid.o
假设我有一个包含 Button 和 Spinbox 的 Widget。单击按钮时,我希望发出 Spinbox 的值。 我看到了两种可能的方法: 要么我可以创建一个私有(private)成员函数 //.
java 8 lamda Stream的Collectors.toMap 参数 使用toMap()函数之后,返回的就是一个Map了,自然会需要key和value。 toMap()的第一个参数就是用来生
fun theItemDTO.toDomainModel( domainOrderId: String, pIds: List = emptyList() ): theItem = l
我有一个 android 项目,它依赖于一个库模块。我的模块中有一个这样的接口(interface): public interface SimpleAnimationListener exte
我有getter方法 @JsonInclude(Include.NON_NULL) public Date getVerifiedFrom() { if(invoices == null ||
假设,我有一个卷积层的 10x10x4 中间输出,我需要将其分成 100 个 1x1x4 卷,并对每个卷应用 softmax,以获得 100 个输出网络。有没有办法在不使用 Lambda 层的情况下完
我写了这样的 JavaFX 摆弄: MenuItem menuItem1 = new MenuItem("Item 1") menuItem1.setOnAction(e -> {
我在研究 lambda 表达式时遇到了这个问题: #include using std::cout; int main() { auto lam = [](int a){ cout #inc
考虑下面的模板函数 sort(...)。这是一个围绕 std::sort 的包装函数。目的是在对用户定义类的 vector 进行排序时提供更好的语法。第一个参数是要排序的 vector 。第二个参数是
TLDR header authorization 没有随 apollo 一起发送。这导致 You do not have the appropriate capabilities to perfor
我在 API 网关之后使用 NodeJs Lambda。 var AWS = require('aws-sdk'); const cognito = new AWS.CognitoIdentitySe
我每天晚上 8 点使用 chalice 和 lambda 函数安排 ec2 实例关闭。 我已经配置了 chalice ,但无法使用 chalice 触发或集成 python 脚本 导入 boto3 #
我正在学习 Java 8 中的 Lambda 表达式和方法引用,发现我们可以通过使用“super”来引用方法的父类(super class)版本,如: super ::名称 但是当我这样做时,它不起作
如何将 CommaDelimitedList 参数转换为字符串,以便将其作为环境变量传递给 Lamda 函数? 下面是示例 CommaDelimitedList 参数,其中包含 AWS 区域列表,我需
我使用的第三方 API 返回一个类型为 int[] 的数组。我们将其称为 readWords: int[] readWords 然而,这个重新调整的数组应该是一个 uint[]。所以我正在进行以下转换
我是一名优秀的程序员,十分优秀!