Я хочу відкрити ТІЛЬКИ статичні Методи класу під час виконання, як це зробити? Або як розмежувати статичні та нестатичні методи.
Я хочу відкрити ТІЛЬКИ статичні Методи класу під час виконання, як це зробити? Або як розмежувати статичні та нестатичні методи.
Відповіді:
Використовуйте Modifier.isStatic(method.getModifiers())
.
/**
* Returns the public static methods of a class or interface,
* including those declared in super classes and interfaces.
*/
public static List<Method> getStaticMethods(Class<?> clazz) {
List<Method> methods = new ArrayList<Method>();
for (Method method : clazz.getMethods()) {
if (Modifier.isStatic(method.getModifiers())) {
methods.add(method);
}
}
return Collections.unmodifiableList(methods);
}
Примітка. Цей метод насправді небезпечний з точки зору безпеки. Class.getMethods "обхід [es] SecurityManager перевіряє залежно від завантажувача класу безпосереднього абонента" (див. Розділ 6 Керівних принципів безпечного кодування Java).
Відмова від відповідальності: Не перевірена і навіть не складена.
Примітка Modifier
повинна використовуватися обережно. Прапори, представлені у формі ints, не є безпечними. Поширена помилка - тестування прапора модифікатора на типі об'єкта відображення, до якого він не застосовується. Можливо, прапор, що знаходиться в тому самому положенні, встановлюється для позначення деякої іншої інформації.
Ви можете отримати статичні методи, такі:
for (Method m : MyClass.class.getMethods()) {
if (Modifier.isStatic(m.getModifiers()))
System.out.println("Static Method: " + m.getName());
}
Щоб уточнити попередню (правильну) відповідь, ось повний фрагмент коду, який робить те, що ви хочете (винятки ігноруються):
public Method[] getStatics(Class<?> c) {
Method[] all = c.getDeclaredMethods()
List<Method> back = new ArrayList<Method>();
for (Method m : all) {
if (Modifier.isStatic(m.getModifiers())) {
back.add(m);
}
}
return back.toArray(new Method[back.size()]);
}