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注意!