[JSR308] Basic Problems (in Design?)
Rémi Forax
forax at univ-mlv.fr
Thu Oct 16 15:23:19 EDT 2008
Artemus, Eugene, if you take a look to the code equals() is called on
the annotation class
(getClass().equals()) not on the annotation itself.
Gaurav, annotations in Java are interfaces not classes to avoid
a common mistake in C# that consist to embed the code that react to an
annotation
directly in the annotation.
In Java, annotations are kind of spec and doesn't suppose a peculiar
implementation.
Moreover, if you want to get an annotation of a specific type, it's
better to use :
http://download.java.net/jdk7/docs/api/java/lang/reflect/AnnotatedElement.html#getAnnotation(java.lang.Class)
in you example:
MyAnnotation annotation=ma.getClass().getAnnotation(MyAnnotation.class);
cheers,
Rémi
Artemus Harper a écrit :
> equals should work for annotations, I don't see why not. If it doesn't
> then its a bug since the documentation for Annotation
> (http://java.sun.com/javase/6/docs/api/java/lang/annotation/Annotation.html)
> states exactly the way equals and hashCode should work. In fact equals
> should even return true if you implement the annotation yourself and
> define what those values return (provided you also implement equals to
> spec).
>
> On Thu, Oct 16, 2008 at 11:52 AM, Eugene Kuleshov <eu at javatx.org
> <mailto:eu at javatx.org>> wrote:
>
> Gaurav,
>
> First of all, it doesn't seem like your particular issue is in scope
> of JSR-308.
> You are right that equals method in Proxy instance generated for
> annotation value does not work, but at this point changing it would
> create backward incompatibilities with previous Java releases.
> Though it
> seem a low risk incompatibility and you can try to open a bug report
> using regular Sun bug reporting system.
>
> Also note that instead of equals(), you can use "ann instanceof
> EdujiniAnnotation" or
> EdujiniAnnotation.class.isAssignableFrom(ann.getClass()) or even
> better
> use clz.getAnnotation(EdujiniAnnotation.class) to avoid creating
> of the
> unnecessary Proxy instances for annotations you are not be
> interested in.
>
> regards,
> Eugene
>
>
> Gaurav Vaish wrote:
> > Hi Artemus,
> >
> > Thanks for the quick response.
> >
> > *I am sorry but your first response seems wrong*.
> > Here's my quick test:
> >
> >
> > @Retention(RetentionPolicy.RUNTIME)
> > public @interface EdujiniAnnotation
> > {
> > String name();
> > int index() default -1;
> > }
> >
> > @EdujiniAnnotation(name = "Alpha")
> > public class AnnotationTest
> > {
> > public static void main(String[] args)
> > {
> > System.out.println("Java Version: " +
> > System.getProperty("java.version"));
> > System.out.println("Java Version: " +
> > System.getProperty("java.vendor"));
> > Class clz = AnnotationTest.class;
> > Annotation[] allAnnots = clz.getDeclaredAnnotations();
> >
> > for(Annotation ann: allAnnots)
> > {
> > System.out.println("Annotatiton: " +
> > ann.getClass().getName());
> > System.out.println("Equality: " +
> > ann.getClass().equals(EdujiniAnnotation.class));
> > }
> > }
> >
> > }
> >
> >
> > Output:
> >
> > Java Version: 1.6.0
> > Java Version: Sun Microsystems Inc.
> > Annotatiton: $Proxy1
> > Equality: false
> >
> >
> > I know this is not going to work... since it is THE reason as to
> why I
> > have a bunch of "instanceof" checks.... a bit pain in the....
> >
> >
> > Regarding the second item... I would be anxious to know about the
> > "rather dangerous things" allowed.
> > And yeah... .Net also allows Annotations with different Annotations.
> > Infact, the annotation AttributeUsageAttribute is THE way to specify
> > restrictions on the usage (similar to the annotation Target).
> >
> > Infact, I see the .Net Attributes several magnitudes more powerful
> > than Java Annotations which - at least to me - seem like a kid still
> > learning to crawl. Apologies if it hurts, but that's my view.
> >
> >
> >
> > --
> > Happy Hacking,
> > Gaurav Vaish
> > http://www.mastergaurav.com <http://www.mastergaurav.com/>
> > http://dwt.sourceforge.net <http://dwt.sourceforge.net/>
> > http://www.edujini-labs.com <http://www.edujini-labs.com/>
> >
> >
> >
> >
> > On Thu, Oct 16, 2008 at 11:15 PM, Artemus Harper
> <subanark at gmail.com <mailto:subanark at gmail.com>
> > <mailto:subanark at gmail.com <mailto:subanark at gmail.com>>> wrote:
> >
> > 1. There is no need to do this because this is true:
> > ma.annotationType().equals(MyAnnotation.class);
> >
> > 2. Java has less boilerplate then c# does. In c# you have to
> keep
> > track of your own variables and property values, it allows more
> > customization, but allows programmers to do some rather
> dangerous
> > things with annotations. What you see documented in the javadoc
> > for an annotated element is exactly what you will get when you
> > query it. Also note that java unlike .NET allows for annotations
> > within (different) annotations. You can create utility
> classes to
> > process the annotations as necessary, or possibly put some
> custom
> > logic into the enum values that are in the annotation.
> >
> > On Thu, Oct 16, 2008 at 10:14 AM, Gaurav Vaish
> > <gaurav.vaish at gmail.com <mailto:gaurav.vaish at gmail.com>
> <mailto:gaurav.vaish at gmail.com <mailto:gaurav.vaish at gmail.com>>>
> wrote:
> >
> > Hi,
> >
> > I have been working with both Java since 1999 and .Net since
> > 2000. Though I don't want to compare them, but both have
> > evolved learning from each other.
> >
> > And though Annotations is a great welcome, I still do not
> > appreciate the way they have been taken up in Java.
> >
> > Few problems:
> >
> > 1. Since the instances of Annotations are available through
> > reflection (getAnnotations method), I would love if the
> > following held true:
> >
> > public @interface MyAnnotation { ... }
> >
> > @MyAnnotation public class ABC { ... }
> >
> > MyAnnotation ma = getMyAnnotationAtClassABC(...);
> >
> > *ma.getClass().equals(MyAnnotation.class); *// I want
> > this to be true
> >
> > *Reason: *The best advantage that we get is... suppose I
> > need to keep a track of the annotations added, I can keep a
> > Map<Class, Instance> and then directly say
> > map.put(ma.getClass(), ma). This will ensure that my code is
> > forward compatible.
> >
> > I am (infact, my company is) - not sure about others - in
> > great need to his feature and my Web 2.0 (Ajax based)
> > application heavily relies on annotations for JSON
> > Serialization/Deserialization. Annotations have helped
> me make
> > my serializer quite generic... but still has to rely on
> > several "/instanceof/" ensuring that my code if forward
> > compatible.
> >
> > 2. And I still wonder - it will be great if somebody can
> > explain or point me to the rationale - why the
> "interface" and
> > "proxy" route has been chosen.
> >
> > I would again love to have *"classes" working as
> > attributes*, like how it is available in .Net.
> >
> > *Reason*: Related functionality can be encapsulated
> in the
> > attribute-class itself.
> >
> > *Example*: I want to have an attribute-driven validation
> > framework. I create a base, may be abstract class, Validator
> > that has a method doValidate. And then to use as
> annotation, I
> > create an annotation ValidatorAnnotation that has a method
> > createValidator. May be this annotation is abstract.
> > Implementations can inherit from it and implent
> > createValidator method. Any initialization that is required
> > for the actual validator is now encapsulated in the
> sub-class
> > rather than requiring me to create another class to
> > instantiate the validator.
> >
> > Add to it the problem mentioned in (1) and the pain
> problem
> > of the developers should be well visible.
> >
> > If need be I can post here some real case-studies
> (code) as
> > to what we (the developers) do now and what fantastic
> thing we
> > can have with just these two features available.
> >
> > And as I write this, I see some interesting thought
> > provoking postings at:
> >
> >
> https://lists.csail.mit.edu/pipermail/jsr308/2008-October/000482.html
> >
> >
> https://lists.csail.mit.edu/pipermail/jsr308/2008-October/000483.html
> >
> >
> > --
> > Happy Hacking,
> > Gaurav Vaish
> > http://www.mastergaurav.com
> > http://dwt.sourceforge.net
> > http://www.edujini-labs.com
> >
> >
> >
> >
> >
> > _______________________________________________
> > JSR308 mailing list
> > JSR308 at lists.csail.mit.edu
> <mailto:JSR308 at lists.csail.mit.edu>
> <mailto:JSR308 at lists.csail.mit.edu
> <mailto:JSR308 at lists.csail.mit.edu>>
> > https://lists.csail.mit.edu/mailman/listinfo/jsr308
> >
> >
> >
> >
> > --
> > Artemus Harper
> >
> >
> >
> ------------------------------------------------------------------------
> >
> > _______________________________________________
> > JSR308 mailing list
> > JSR308 at lists.csail.mit.edu <mailto:JSR308 at lists.csail.mit.edu>
> > https://lists.csail.mit.edu/mailman/listinfo/jsr308
> >
>
>
> _______________________________________________
> JSR308 mailing list
> JSR308 at lists.csail.mit.edu <mailto:JSR308 at lists.csail.mit.edu>
> https://lists.csail.mit.edu/mailman/listinfo/jsr308
>
>
>
>
> --
> Artemus Harper
> ------------------------------------------------------------------------
>
> _______________________________________________
> JSR308 mailing list
> JSR308 at lists.csail.mit.edu
> https://lists.csail.mit.edu/mailman/listinfo/jsr308
>
More information about the JSR308
mailing list