[ 
https://issues.apache.org/jira/browse/LANG-403?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12562380#action_12562380
 ] 

Joerg Schaible commented on LANG-403:
-------------------------------------

We could try to load Annotation.class dynamically and if it is available, the 
HashCode algorithm could test if the given instance is assignable and use the 
calculation required by the JDK docs for Annotations.

> 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
>             Fix For: LangTwo 1.0
>
>
> 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
> [EMAIL PROTECTED],_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.

Reply via email to