Вопрос

Как я могу получить доступ к простому объекту 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);
        }
      }
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top