[ https://issues.apache.org/jira/browse/LANG-403?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Paul Benedict updated LANG-403: ------------------------------- Fix Version/s: (was: 3.0) 3.x Without a patch, moving this to post 3.0 release. > HashcodeBuilder is broken for Annotations > ----------------------------------------- > > Key: LANG-403 > URL: https://issues.apache.org/jira/browse/LANG-403 > Project: Commons Lang > Issue Type: Bug > Components: lang.builder.* > Affects Versions: 2.3 > Reporter: Jay Liang > Fix For: 3.x > > > HashCodeBuilder does not produce a correct hashCode that conforms to java > language specs. Running the following code snippets, i get > @Simple$CustomAnnotation(name=blah, type=class java.lang.String) hashCode= > 895255138 > simple$customannotationi...@665753[_name=blah,_type=class java.lang.String] > hashCode= 122852694 > hashCode should be 895255138 > The hashCode should computed according to > http://java.sun.com/j2se/1.5.0/docs/api/java/lang/annotation/Annotation.html#hashCode() > for annotations. > {code:java} > public class Simple{ > @Retention(RetentionPolicy.RUNTIME) > @Target({FIELD, METHOD, PARAMETER}) > private @interface CustomAnnotation{ > public String name(); > public Class<?> type(); > } > private static class CustomAnnotationImpl implements CustomAnnotation{ > final String _name; > final Class<?> _type; > public CustomAnnotationImpl(String name, Class<?> type) { > _name = name; > _type = type; > } > public String name() { > return _name; > } > public Class<?> type() { > return _type; > } > public Class<? extends Annotation> annotationType() { > return CustomAnnotation.class; > } > @Override > public int hashCode() { > return HashCodeBuilder.reflectionHashCode(this); > } > /** > * This conform to specs defined at > http://java.sun.com/j2se/1.5.0/docs/api/java/lang/annotation/Annotation.html#hashCode > * @return good annotation hashCode > */ > public int goodHashCode() { > return (127 * "name".hashCode() ^ _name.hashCode()) + (127 > *"type".hashCode() ^ _type.hashCode()); > } > > @Override > public String toString() { > return ToStringBuilder.reflectionToString(this); > } > } > private static class Test{ > @CustomAnnotation(name="blah", type=String.class) > String _blah; > @Override > public String toString() { > return ToStringBuilder.reflectionToString(this); > } > } > > public static void main(String[] args) throws Exception{ > for(Field f : Test.class.getDeclaredFields()){ > for(Annotation a : f.getAnnotations()){ > System.out.println(a + " hashCode= " + a.hashCode()); > CustomAnnotationImpl c = new Simple.CustomAnnotationImpl("blah", > String.class); > System.out.println(c + " hashCode= " + c.hashCode()); > System.out.println("hashCode should be "+ c.goodHashCode()); > } > } > } > } > {code} -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.