2012-03-07 3 views
-2

В этом же пакете есть two classes A and B.Получите имя функций, вызываемых классом

как получить имя функции класса А называется классом В.

Ограничением является то, что код A и B не может быть изменен.

+4

Непонятно, что задается вопросом, пожалуйста, обновите свой вопрос, чтобы сделать то, что вы пытаетесь сделать более понятным. Также, пожалуйста, отправьте код того, что вы пробовали. –

+0

Вы хотите сделать это во время выполнения? По статическому анализу? С тем, что вы опубликовали до сих пор, это не вопрос по стандартам SO. –

+0

@JimGarrison Я хочу сделать это путем статического анализа. – Saurabh

ответ

1

Отражение может быть очень полезным, но очень сложным, если вы его не понимаете.

Если у вас есть имя класса, и хотите напечатать методы:

Class c = Class.forName(the_class_name); 

for(Method m : c.getMethods()) { 
    System.out.println(m.toString()); 
} 

Если вы хотите, чтобы имя класса любого заданного объекта:

String className = the_object.getClass().getName(); 

Комбинация из два могут выглядеть так:

for(Method m : the_object.getClass().getMethods()) 
    System.out.println(m.toString()); 

Я думаю, что вы просите имена всех методов от A, что B звонки.

Этого не может быть сделано с отражением, главным образом потому, что Java не предоставляет никакого способа для этого.

The API, как всегда, предоставляет дополнительную информацию. Если вы посмотрите там, вы можете придумать простую работу.

1

«Класс всех функций, называемых классом A или классом B», запутан. Но если вы хотите получить имя класса и функции вызывающего объекта методу detectsName, описанному в вашем классе A, тогда вам будет полезен следующий код.

public class A { 
    public void detectsName() { 
     Throwable t = new Throwable(); 
     StackTraceElement traceLine = t.getStackTrace()[1]; 
     // t.printStackTrace(); 
     String className = traceLine.getClassName(); 
     String methodName = traceLine.getMethodName(); 
     int lineNumber = traceLine.getLineNumber(); 
     System.out.println(className); 
     System.out.println(methodName); 
     System.out.println(lineNumber); 
    } 
} 

Если вы вызываете этот метод из любого другого класса, скажите - B, он будет обнаружен.

public class B { 
    public static void main(String[] args) { 
     A a = new A(); 
     a.detectsName(); 
    } 
} 
3

Вы не можете использовать отражение Java для выполнения задач статического анализа кода, подобных этому. API-интерфейсы отражения не предоставляют необходимую информацию.

Off верхней части моей головы, я могу думать о двух подходов, которые будут работать:

  • Если у вас есть только файлы «.class», то вы можете использовать библиотеку байткодом такие как BCEL к загружать классы и пересекать их, чтобы идентифицировать все вызовы методов.

  • Если у вас есть исходный код, вы также можете использовать некоторую существующую библиотеку парсеров Java для создания АСТ для вашего кода и анализа их.

(Первый подход, вероятно, проще, если все, что вы хотите, это список имен классов и методов.)

0

Dependency Finder могут делать запросы для этого. Его подход состоит в том, чтобы генерировать метаданные в XML, а затем использовать сравнение на основе regexp. Возможно, вы специально ищете функцию, называемую «закрытие» с помощью ссылки на вход.