You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Jay Liang (JIRA)" <ji...@apache.org> on 2008/01/24 18:02:36 UTC

[jira] Updated: (LANG-403) HashcodeBuilder is broken for Annotations

     [ https://issues.apache.org/jira/browse/LANG-403?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Jay Liang updated LANG-403:
---------------------------

    Description: 
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$CustomAnnotationImpl@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.

===============
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());
      }
    }
  }

} 

  was:
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$CustomAnnotationImpl@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.

===============
public class Simple{
  @BindingAnnotation
  @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 = Objects.nonNull(name, "property name should not be null");
      _type = Objects.nonNull(type, "property type should not be null");
    }

    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());
      }
    }
  }

} 


removed google guice codes

> HashcodeBuilder is broken for Annotations
> -----------------------------------------
>
>                 Key: LANG-403
>                 URL: https://issues.apache.org/jira/browse/LANG-403
>             Project: Commons Lang
>          Issue Type: Bug
>    Affects Versions: 2.3
>            Reporter: Jay Liang
>
> 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$CustomAnnotationImpl@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.
> ===============
> 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());
>       }
>     }
>   }
> } 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.