是否有可能获得通过反射或其他魔术的方法的行号?
这是可能的,如果方法是当前的堆栈跟踪内。 使用Thread.currentThread().getStackTrace()
一个可以得到的行号StackTraceElement
。 但是,我能做些什么,如果我只得到了java.lang.reflect.Method
对象?
我发现这一点,类- > 如何从java.lang.Class对象,获取源文件名/行号 ,但它不是方法中。
是否有可能获得通过反射或其他魔术的方法的行号?
这是可能的,如果方法是当前的堆栈跟踪内。 使用Thread.currentThread().getStackTrace()
一个可以得到的行号StackTraceElement
。 但是,我能做些什么,如果我只得到了java.lang.reflect.Method
对象?
我发现这一点,类- > 如何从java.lang.Class对象,获取源文件名/行号 ,但它不是方法中。
我想要做同样的事情,一些研究后定居在了Javassist。 您将需要添加了Javassist(我使用的版本3.15.0-GA)。
考虑下面的类确定“X”的方法的位置。 方法名“X”是硬编码但如果你是在同一条船上,我的反思是不是很辛苦,所以我相信你可以得到方法的名称列表,那么下面就让你得到的行号方法:
public class Widget {
void x(){System.out.println("I'm x\n");}
//comment added to create space
void y(){System.out.println("I'm y\n");}
}
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;
public class App {
public static void main(String[] args) throws NotFoundException {
System.out.println("Get method line number with javassist\n");
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("com.quaternion.demo.Widget");
CtMethod methodX = cc.getDeclaredMethod("x");
int xlineNumber = methodX.getMethodInfo().getLineNumber(0);
System.out.println("method x is on line " + xlineNumber + "\n");
}
}
输出 : method x is on line 12
这在我的情况是准确的我剪下一些评论...
注 :由于在评论中提到的Pete83,这种方法实际上返回的代码在方法的第一行,而不是它声明的方法就行了。 这通常不会像大多数可能会想建立相对位置(它们被声明的顺序),并利用这些信息为自己约定的问题。 这将拿出任何你觉得有必要包括可以通过代码本身中的位置很容易地确定一个注释内的序号值的时间。
<dependency>
<groupId>org.javassist</groupId> <!-- if a version prior to 3.13.0-GA is needed use "javassist" and not "org.javassist" -->
<artifactId>javassist</artifactId>
<version>3.15.0-GA</version>
</dependency>
对我来说,四元的指向了Javassist的回答是这个问题的完美解决方案。 它的工作原理,我和你也可以用它的时候,你只能得到的java.lang.reflect.Method对象。
这是我做的:
Method m; // the method object
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get(m.getDeclaringClass().getCanonicalName());
CtMethod javassistMethod = cc.getDeclaredMethod(m.getName());
int linenumber = javassistMethod.getMethodInfo().getLineNumber(0);
你不能从一种线条的数字,因为你不知道这适用于什么方法。 一种方法可以调用任何子类您选择的一个。