Как я могу обращаться с POJO как боб? - PullRequest
2 голосов
/ 21 октября 2009

Как я могу получить доступ к простому объекту 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, который, похоже, может мне помочь. Но я не могу найти хорошую отправную точку.

Любые намеки?

Ответы [ 3 ]

6 голосов
/ 21 октября 2009

Я думаю, что функциональность, которую вы ищете, напоминает функциональность класса Apache-Commons BeanUtils:

http://commons.apache.org/beanutils/

Взгляните на метод getProperty () объекта BeanUtils.

2 голосов
/ 21 октября 2009

java.beans.Introspector.getBeanInfo возвращает объект, реализующий java.beans.BeanInfo, который, в свою очередь, может использоваться для получения PropertyDescriptor с и MethodDescriptor с (через его getPropertyDescriptors - и getMethodDescriptors -методы), которые, в свою очередь, могут использоваться для получения информации, которую вы на самом деле хотите.

Это на самом деле не меньше усилий, чем использование отражения.

0 голосов
/ 21 октября 2009

Как указано в комментариях к вопросу выше, я все еще не уверен, что вы хотите, но это звучит так, как будто вы хотите, чтобы обернуть объект получает и устанавливает в интерфейс с 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);
        }
      }
  }
}
...