I've a huge project with many classes. I've a very specific class; let's name it SuperFoo. I need to find all calls to the method equals() with argument of type Superfoo. Hope it's clear.
So, one more time... in thousands of java files (or bytecode?) I'd like to find all calls to the method java.lang.Object.equals(Object arg) but the argument to this call must be of type SuperFoo. For example:
public void doItWith(SuperFoo foo) {
if (otherFoo.equals(foo)){
// do something
}
...
}
I checked out Browse-by-query, analyzing bytecode and just Java Search in Eclipse and in my opinion none of this works.
解决方案
A programmatic approach would be to use Aspect Oriented Programming (i.e. AspectJ). You would define a pointcut to capture the method call of interest
pointcut equals(Superfoo o) = call(boolean *.equals(Object)) && args(o);
and then use advice to select each occurrence and query the joinpoint object to get the static information i.e. where it appears in your code.
before(Superfoo o) : equals(o) {
System.out.println("An occurence at "+thisJoinPoint.getSourceLocation());
}