Я пишу класс java, у которого много геттеров. Теперь я хочу получить все методы getter и вызывать их когда-нибудь. Я знаю, что есть такие методы, как getMethods() или getMethod (String name, Class ... parameterTypes), но я просто хочу получить getter действительно ..., используйте regex? кто-нибудь может сказать мне? Спасибо!Java Reflection: Как я могу получить все методы getter класса java и вызывать их
ответ
Не следует использовать регулярное выражение, используйте Introspector
:
for(PropertyDescriptor propertyDescriptor :
Introspector.getBeanInfo(yourClass).getPropertyDescriptors()){
// propertyEditor.getReadMethod() exposes the getter
// btw, this may be null if you have a write-only property
System.out.println(propertyDescriptor.getReadMethod());
}
Обычно вы не хотите свойств от Object.class, так что вы бы использовать метод с двумя параметрами:
Introspector.getBeanInfo(yourClass, stopClass)
// usually with Object.class as 2nd param
// the first class is inclusive, the second exclusive
BTW: есть рамки, которые делают это для вас и представляют вам вид на высоком уровне. Например. Обще/BeanUtils имеет метод
Map<String, String> properties = BeanUtils.describe(yourObject);
(docs here), который делает только что: найти и выполнить все методы получения и сохранения результата на карте. К сожалению, BeanUtils.describe()
преобразует все значения свойств в строки перед возвратом. WTF. Благодаря @danw
Обновление:
Вот 8 метод Java, который возвращает Map<String, Object>
на основе свойств компонента объекта.
public static Map<String, Object> beanProperties(Object bean) {
try {
return Arrays.asList(
Introspector.getBeanInfo(bean.getClass(), Object.class)
.getPropertyDescriptors()
)
.stream()
// filter out properties with setters only
.filter(pd -> Objects.nonNull(pd.getReadMethod()))
.collect(Collectors.toMap(
// bean property name
PropertyDescriptor::getName,
pd -> { // invoke method to get value
try {
return pd.getReadMethod().invoke(bean);
} catch (Exception e) {
// replace this with better error handling
return null;
}
}));
} catch (IntrospectionException e) {
// and this, too
return Collections.emptyMap();
}
}
Возможно, вы захотите сделать обработку ошибок более надежной. Извините за шаблон, проверенные исключения не позволяют нам полностью функционировать здесь.
Оказывается, что Collectors.toMap() ненавидит нулевые значения. Вот более настоятельной версия кода выше:
public static Map<String, Object> beanProperties(Object bean) {
try {
Map<String, Object> map = new HashMap<>();
Arrays.asList(Introspector.getBeanInfo(bean.getClass(), Object.class)
.getPropertyDescriptors())
.stream()
// filter out properties with setters only
.filter(pd -> Objects.nonNull(pd.getReadMethod()))
.forEach(pd -> { // invoke method to get value
try {
Object value = pd.getReadMethod().invoke(bean);
if (value != null) {
map.put(pd.getName(), value);
}
} catch (Exception e) {
// add proper error handling here
}
});
return map;
} catch (IntrospectionException e) {
// and here, too
return Collections.emptyMap();
}
}
Вот та же функциональность в более сжатой форме, с помощью JavaSlang:
public static Map<String, Object> javaSlangBeanProperties(Object bean) {
try {
return Stream.of(Introspector.getBeanInfo(bean.getClass(), Object.class)
.getPropertyDescriptors())
.filter(pd -> pd.getReadMethod() != null)
.toJavaMap(pd -> {
try {
return new Tuple2<>(
pd.getName(),
pd.getReadMethod().invoke(bean));
} catch (Exception e) {
throw new IllegalStateException();
}
});
} catch (IntrospectionException e) {
throw new IllegalStateException();
}
}
А вот версия гуавы:
public static Map<String, Object> guavaBeanProperties(Object bean) {
Object NULL = new Object();
try {
return Maps.transformValues(
Arrays.stream(
Introspector.getBeanInfo(bean.getClass(), Object.class)
.getPropertyDescriptors())
.filter(pd -> Objects.nonNull(pd.getReadMethod()))
.collect(ImmutableMap::<String, Object>builder,
(builder, pd) -> {
try {
Object result = pd.getReadMethod()
.invoke(bean);
builder.put(pd.getName(),
firstNonNull(result, NULL));
} catch (Exception e) {
throw propagate(e);
}
},
(left, right) -> left.putAll(right.build()))
.build(), v -> v == NULL ? null : v);
} catch (IntrospectionException e) {
throw propagate(e);
}
}
// Get the Class object associated with this class.
MyClass myClass= new MyClass();
Class objClass= myClass.getClass();
// Get the public methods associated with this class.
Method[] methods = objClass.getMethods();
for (Method method:methods)
{
System.out.println("Public method found: " + method.toString());
}
Да, но вам также придется проверять каждый метод, что он является открытым, нестатическим, возвращает void, не ожидает никакого параметра и следует за соглашением имени get/isXyz. Introspector делает все это для вас, плюс он кэширует данные BeanInfo для других приложений. –
не возвращает void, то есть –
Reflections каркас для этого
import org.reflections.ReflectionUtils.*;
Set<Method> getters = ReflectionUtils.getAllMethods(someClass,
ReflectionUtils.withModifier(Modifier.PUBLIC), ReflectionUtils.withPrefix("get"));
Не все геттеры начинаются с «get»: (1) boolean-возвращающиеся getters могут начинаться с «is»; (2) класс BeanInfo может утверждать, что дополнительные методы - это геттеры.Вы действительно должны добавить ограничение, например: если вы знаете, что все ваши получатели начинаются с «get», вы можете это сделать. – toolforger
Вы должны поддерживать общий геттер в каждом компоненте, таким образом, чтобы вызвать getAttribute1(), вы должны иметь возможность ссылаться на общий геттер Get («attribute1»)
Этот общий добытчик будет в свою очередь Invoke правильный геттер
Object get(String attribute)
{
if("Attribute1".equals(attribute)
{
return getAttribute1();
}
}
этот подход включает в себя вам сохранить этот отдельный список в каждом компоненте, но таким образом, вы избежать отражения, которая имеет проблемы с производительностью, так что если вы пишете производственный код, который нужно иметь хорошую производительность, вы можете использовать выше шаблон для всех ваших бобов.
Если это некий код кода или код полезности, который не имеет требований высокой производительности, тогда вам лучше использовать другие подходы, поскольку этот подход подвержен ошибкам, если вы не можете написать какой-то счетчик времени компиляции, который обеспечивает эту общую функцию getter работает для всех атрибутов.
Spring предлагает простой BeanUtil method для Bean самоанализа:
PropertyDescriptor pd = BeanUtils.getPropertyDescriptor(clazz, property);
Method getter = pd.getReadMethod();
Этот код проверяется в порядке.
private void callAllGetterMethodsInTestModel(TestModel testModelObject) {
try {
Class testModelClass = Class.forName("com.encoders.eva.testreflectionapi.TestModel");
Method[] methods = testModelClass.getDeclaredMethods();
ArrayList<String> getterResults = new ArrayList<>();
for (Method method :
methods) {
if (method.getName().startsWith("get")){
getterResults.add((String) method.invoke(testModelObject));
}
}
Log.d("sayanReflextion", "==>: "+getterResults.toString());
} catch (ClassNotFoundException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
- 1. Получить методы с использованием класса Java Reflection
- 2. Методы Getter в Java
- 3. Java Reflection и потокобезопасность
- 4. Clojure новичку, как вызывать методы объекта Java
- 5. java динамически вызывать методы
- 6. Reflector: Как перечислить геттеры класса и вызвать их в Java?
- 7. Вызывать методы динамически на Java
- 8. методы Invoke сеттер с использованием переменной цикла и Java Reflection
- 9. Java - BigDecimal и Reflection
- 10. Проверка класса Java Reflection Type
- 11. Java Reflection - получить все имена переменных экземпляра класса
- 12. Как я могу получить @getter и @setter?
- 13. наследовать все методы getter/setter для java obj
- 14. Java | Как подсчитать все методы с помощью Reflection & RTTI?
- 15. Получить все методы интерфейса или абстрактного класса с помощью Reflection
- 16. Получить тип класса из Reflection Java
- 17. Как перечислить все методы экземпляра Java-класса?
- 18. Как я могу получить объект объектов и динамически их вызывать?
- 19. Автоматически делегируя все методы класса Java
- 20. Java Getter и Setter Метод
- 21. Java Reflection methods hashmap
- 22. Как получить все общедоступные статические методы класса в Java?
- 23. Java getter() и setter()
- 24. Reflection IllegalArgumentException java
- 25. Как я могу использовать методы из другого класса в Java?
- 26. Java getter для несуществующего атрибута класса
- 27. Методы класса Java undefined
- 28. Java Setter и Getter
- 29. Как я могу получить все методы в протоколе?
- 30. Методы наследования и блокировки класса Java класса
Ничего себе. Я не знал, что ты можешь это сделать! Круто! –
Спасибо ..и проверить код ... конец вывода ** общедоступный конечный родной java.lang.Class java.lang.Object.getClass() ** ... я не хочу его вызывать. Как его удалить? – user996505
@ user996505 Используйте Introspector.getBeanInfo (yourClass, Object.class), чтобы искать все классы ниже. Объект –