两个班级:
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");
整数类型引用字符串类型值。 谁可以帮助我?
答案 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,并保持它们同步,这样旧的代码仍然可以在某种程度上跛行。