我有一个系统,它接受一个类名并由soot枚举 - 它提供了详细信息,例如类中的所有方法,所述类的修饰符,可见性,方法的参数等等
我所做的就是获取该信息并构建一个java文件,我实例化该类(通过反射或常规实例化),调用该类的每个方法成员,然后编译它并在我们系统的其他地方使用它。我已经有98个我的测试用例了。失败的2%是作为方法的参数的对象是内部类(package.path.here.ClassName $ InnerClass作为变量类型)。
请注意:我不关心方法中的内容,我只关心枚举阶段的签名。
当我尝试编译一个具有参数包含cannot find symbol
的方法成员的类时,我得到的编译器错误是package.path.here.ClassName$InnerClass
。
所以我的输入很简单package.path.here.ToEnumerate
:
package package.path.here;
public class ToEnumerate {
public ToEnumerate() {
//irrelevant code here
}
public void method1(some.other.package.OtherClass$InnerClass c, long a) {
// irrelevant code here
}
public void method1(int x, long b) {
// irrelevant code here
}
public void method1(yet.another.package.YetAnotherClass b, long a) {
// irrelevant code here
}
public void method2(long b, boolean a) {
// irrelevant code here
}
public int method3(int x) {
// irrelevant code here
}
}
通过我的系统,我将生成一个如下所示的Java文件:
package package.path.here;
// all necessary imports are auto generated
public class ToEnumerate_Main {
public static void main(String[] args) {
ToEnumerate inst = new ToEnumerate();
Object obj = new Object();
inst.method1((some.other.package.OtherClass$InnerClass) obj, (long) -1);
inst.method1((int)-1, (long)-1);
inst.method1((yet.another.package.YetAnotherClass) obj, (long) -1);
inst.method2((long)-1, false);
inst.method3((int)-1);
}
}
当我使用:javac -cp /path/to/all/my/classes ToEnumerate_Main.java
编译时,我得到了cannot find symbol
对内部类的引用。胡萝卜指向最后一个包路径和类名之间的句点:
ToEnumerate_Main.java:7: error: cannot find symbol
inst.method1((some.other.package.OtherClass$InnerClass) obj, (long) -1);
^
symbol: class OtherClass$InnerClass
location: package some.other.package
即使我可以在该路径中找到该文件,该文件也包含在-cp
的{{1}}参数中。
如果我更改ToEnumerate_Main以发送某些基于对象的变量javac
,如果有人尝试发送nulls
,我会得到reference to method1 is ambiguous
,就像您希望的那样。
我不太确定为什么编译时会抛出null
错误,因为我文件肯定存在。任何帮助,以确定抛出此错误的原因,cannot find symbol
找不到该文件的原因,或获得此工作的方法将非常感激。