取石子问题 java,JDK获取注解的一个bug

public interface IAuditLog {

public T getId();

public void setId(T t);

}

@Table(name="auditlog1")

public class AuditLog1 implements IAuditLog {

private static final long serialVersionUID = 1L;

//get and set

public void setId(Integer value) {

this.id = value;

}

@Id

public java.lang.Integer getId() {

return this.id;

}

}

@Table(name="auditlog2")

public class AuditLog2 implements IAuditLog {

private static final long serialVersionUID = 1L;

//get and set

public void setId(String value) {

this.id = value;

}

@Id

public String getId() {

return this.id;

}

}

一个接口,两个实现,主要是区分了ID的类型,AuditLog1是Integer,AuditLog2是String,但是无法获得@Id这个注解.

PropertyDescriptor pd = new PropertyDescriptor("id", AuditLog1.class);

Method getMethod = pd.getReadMethod();//

boolean isId=getMethod.isAnnotationPresent(Id.class);

//无论是AuditLog1 还是 AuditLog2 isId返回的都是false

这样是因为使用了泛型, JDK认为 getMethod 方法的返回值既不是Integer,也不是String,而是Object,所以无法得到@Id 这个注解.但是 在java语言里,返回类型不作为区分方法的特征,即便是认为返回值是Object 也应该能够找到@Id这个注解,所以这个是JDK的bug

在最新的JDK7 U17已经解决了这个问题,可以获取@Id注解. JDK7的早期版本(我只测试了 JDK7 U2)也存在这个问题,也就是意味着JDK6全线版本都存在这个问题.希望各位javaer注意!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值