整数类型引用字符串类型值

时间:2010-06-24 03:09:02

标签: java generics reflection

两个班级:

public class BaseDo<K> {
    protected K id;

    public K getId() {
        return id;
    }

    public void setId(K id) {
        this.id = id;
    }
}


public class BeanDo extends BaseDo<Integer> {
    private String beanName;

    public String getBeanName() {
        return beanName;
    }

    public void setBeanName(String beanName) {
        this.beanName = beanName;
    }
}

我想用反射来实现这样:

BeanDo beanDo = new BeanDo();
beanDo.setId("string here");

整数类型引用字符串类型值。 谁可以帮助我?

5 个答案:

答案 0 :(得分:1)

Java中的泛型不是在运行时使用的,因此就java运行时而言,您的ID字段属于Object类型,因此无论泛型如何都可以设置为任何值。也就是说,这样做是一个坏主意,因为任何假设通用合同都会失败。

您可以通过反射设置字段,如下所示:

BeanDo beanDo = new BeanDo();
Method method = BeanDo.getClass().getMethod("setId", Object.class);
method.invoke(beanDo, "SomeRandomString");

也就是说,这样做是一个非常糟糕的主意,因为任何针对BeanDo编译的代码都会假设id是一个整数而不是String。所以像beanDo.getId()这样的代码都会因类抛出异常而失败,因为它实际上并不是整数。

和其他海报一样,我对你想要达到的目标有点暗淡。

答案 1 :(得分:0)

这样的东西?

public class BaseDo<K> {

  protected K id;

  public K getId() {
    return id;
  }

  public void setId(K id) {
    this.id = id;
  }

}

public class BeanDo extends BaseDo<Integer> { 

  private String beanName;

  public void setId(String id) {
    setId(Integer.parseInt(id));
  }

  public String getBeanName() {
    return beanName;
  }

  public void setBeanName(String beanName) {
    this.beanName = beanName;
  }

}

现在你可以使用这样的东西:

BeanDo beanDo = new BeanDo();
beanDo.setId("2");

答案 2 :(得分:0)

这个怎么样:

BeanDo beando = new BeanDo();
beando.setId("string there".hashCode());

我不明白你的意思“我想用反射来实现这个”

我猜你想要这样的东西:

    BeanDo doer = ... // get it from somewhere
    String id   = ... // get it from somewhere else too. 

    // and you want to set id to the doer bean.
    reflectionMagicSetId( doer, id ); 

并采用以下方法:

 private void reflectionMagicSetId( BandDo doer, String id ) {
       /// do some magic here? 
 }

如果这就是你想要的,那么我给你的作品就完美了。

 private void reflectionMagicSetId( BandDo doer, String id ) {
     doer.setId( id == null ? 0 : id.hashCode()  );
 }

答案 3 :(得分:0)

如果你想使用整数然后将字符串解析为整数,因为它将包含整数并在调用函数参数中使用该整数

答案 4 :(得分:0)

它似乎是关于能够设置字符串的唯一方法的子类,但仍然保证已经调用getId()的任何人获得他们期望的Integer。像这样:

public class StringBeanDo extends BeanDo {
  private String stringId;

  public String getStringId()
  {
    return stringId;
  }

  public void setId( Integer val )
  {
    super.setId( val );
    stringId = Integer.toString( val );
  }

  public void setId( String str )
  {
    stringId = str;
    super.setId( convertStringToInteger( str )); // Do this however you like.
  }
}

convertStringToInteger的实现取决于您(它取决于此ID的用途)。这里的关键是你要维护两个ID,并保持它们同步,这样旧的代码仍然可以在某种程度上跛行。