Обновление
Если вам действительно нужно сделать это по трассировке стека (которую я бы настоятельно рекомендовал бы избегать), я рекомендуюне думаю, что вы можете.Трассировка стека может сообщать вам имена классов и методов, но она не включает типы аргументов метода, и поэтому, если метод перегружен, вы не можете определить, какой из них вызвал method2
.
Я рекомендуюВы пересматриваете свой дизайн.Если method2
необходимо знать тип возврата метода, который его вызывает, то соответствующий метод должен передать эту информацию в method2
.Попытка собрать эту информацию из стека времени выполнения не только неэффективна, но и является красным флагом разработки.
Пример:
public File method1(File f) {
// ...
method2(File.class);
}
public String method1(String s) {
// ...
method2(String.class);
}
public Foo method1(Foo f) {
// ...
method2(Foo.class);
}
Там у нас есть три перегрузки по method1
.Это не проблема для method2
, потому что каждый из них сообщает method2
, каков его тип возврата - или, точнее, я надеюсь, что ему нужно method2
, чтобы создать для него или что-то еще.
Оригинальный ответ
Для конкретного случая, который вы перечислите (особенно в конце вашего вопроса), вы можете сделать это:
public File method1(){
method2(File.class);
}
File.class
является экземпляром Class
для класса File
.
Для общего случая определения типа возвращаемого значения метода в классе можно использовать отражение API .Получите экземпляр Class
для класса, содержащего метод, с помощью Class.forName
, найдите метод на этом экземпляре Class
, используя Class#getMethod
, затем используйте Method#getReturnType
на этом Method
, чтобы узнать класс возвращаемого типа.