JDK获取注解的一个bug

原创
2013/03/26 11:50
阅读数 449
今天调试代码,发现JDK获取注解的一个bug
public interface IAuditLog<T> {
	
	public T getId();
	public void setId(T t);
}
@Table(name="auditlog1")
public class AuditLog1   implements IAuditLog<Integer> {
	
	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<String> {
	
	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 收藏
分享
加载中
嗯了解了,多谢分享。
2013/09/30 13:05
回复
举报
谢谢
2013/03/26 11:58
回复
举报
更多评论
打赏
2 评论
0 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部