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.