如何使用Javassist获取字段声明的行号?

时间:2016-05-25 10:56:18

标签: java reflection javassist

这是对How to get the line number of a method?

的跟进

我有一个java.lang.reflect.Field实例,想知道声明类在声明的哪一行。

目前我有CtField,但缺少getLineNumber()方法。

public static int getLineNumberOf(Field field) {
    ClassPool cp = ClassPool.getDefault();
    CtClass ctClass = cp.getCtClass(field.getDeclaringClass().getName());
    CtField ctField = ctClass.getDeclaredField(field.getName());

    ctField.getLineNumber(); 
    //      ^^^^^^^^^^^^^^  that one is missing.
}

获取行号的正确方法是什么?

编辑:在调查该主题后,似乎字段的行号未存储在类文件中。但在某些情况下,如下所述:java.objectweb.asm Line Number of Methods and Attributes

  

对于在适当位置初始化的字段,锚点就是该行   在方法体中的FIELDPUT指令之前的数字,与   在它之前指向外面的行号输入    方法行号范围(即第一行号之外)   方法中的条目和visitEnd()之前的最后一个条目。有一个   如果构造函数是最后一个方法并且放置了字段   在方法的最后。如果字段初始化,它也不会工作   已在构造函数体中声明。

0 个答案:

没有答案