Как я могу обращаться с POJO как боб?
-
05-07-2019 - |
Вопрос
Как я могу получить доступ к простому объекту Java в виде бина?
Например:
class Simple {
private String foo;
String getFoo() {
return foo;
}
private void setFoo( String foo ) {
this.foo = foo;
}
}
Теперь я хочу использовать этот объект следующим образом:
Simple simple = new Simple();
simple.setFoo( "hello" );
checkSettings( simple );
Поэтому я ищу реализацию метода checkSettings (Object obj)
:
public boolean checkSettings( Object obj ) {
// pseudocode here
Bean bean = new Bean( obj );
if( "hello".equals( bean.getAttribute( "foo" ) ) {
return true;
}
return false;
}
Язык Java содержит пакет под названием java.beans
, который, похоже, может мне помочь. Но я не могу найти хорошую отправную точку.
Есть ли намеки?
Решение
java.beans. Introspector.getBeanInfo
возвращает объект, реализующий java.beans.BeanInfo
, который, в свою очередь, может использоваться для получения PropertyDescriptor
и MethodDescriptor
s ( через его getPropertyDescriptors
- и getMethodDescriptors
-методы), которые, в свою очередь, могут быть использованы для получения информации, которую вы действительно хотите.
Это на самом деле не меньше усилий, чем использование отражения.
Другие советы
Я думаю, что функциональность, которую вы ищете, похожа на функциональность класса Apache-Commons BeanUtils:
http://commons.apache.org/beanutils/
Посмотрите на метод getProperty () BeanUtils.
Как указано в комментариях к вопросу выше, я все еще не уверен, что вы хотите, но это звучит так, как будто вы хотите, чтобы объект обернулся и получил устанавливает интерфейс с getAttribute. Это не то, что я считаю «бобом».
Итак, у вас есть интерфейс:
interface Thingie {
Object getAttribute(String attribute);
}
Вы должны написать реализацию того, что использует отражение.
class Thingie {
Object wrapped;
public Object getAttribute(String attribute) throws Exception {
Method[] methods = wrapped.getClass().getMethods();
for(Method m : methods) {
if (m.getName().equalsIgnoreCase("get"+attribute)) {
return m.invoke(wrapped);
}
}
}
}