Методы класса в Java
Рефлексия перечисляет не только поля, но и методы типа.
Каждый элемент списка имеет тип Method: у него
есть имя, тип возвращаемого значения и параметры.
Метод getDeclaredMethods возвращает все методы,
объявленные в классе, включая закрытые и без учёта
наследования:
class Ledger {
private int balance;
Ledger(int balance) {
this.balance = balance;
}
boolean isEmpty() {
return balance == 0;
}
String label() {
return "ledger";
}
}
public class Main {
public static void main(String[] args) {
for (var method : Ledger.class.getDeclaredMethods()) {
System.out.println(method.getName());
}
}
}
Метод getMethods добавляет открытые методы
родителей, в том числе унаследованные от
Object. Поэтому список обычно длиннее, чем
у getDeclaredMethods:
class Ledger {
boolean isEmpty() {
return true;
}
}
public class Main {
public static void main(String[] args) {
System.out.println(Ledger.class.getDeclaredMethods().length);
System.out.println(Ledger.class.getMethods().length);
}
}
Оба списка можно обойти в одном входе в программу - сначала объявленные методы, затем открытые с учётом наследования, если нужно сравнить состав:
class Ledger {
boolean isEmpty() {
return true;
}
}
public class Main {
public static void main(String[] args) {
Class<?> kind = Ledger.class;
for (var method : kind.getDeclaredMethods()) {
System.out.println("decl:" + method.getName());
}
for (var method : kind.getMethods()) {
if (method.getDeclaringClass() == Ledger.class) {
System.out.println("pub:" + method.getName());
}
}
}
}
Сделайте класс Engine с двумя методами с разными
именами. Напечатайте имена всех объявленных методов.