Java annotation的实例是什么类的?

Java里annotation看起来就像接口一般。如果跟接口一样的话,那肯定不能直接生成实例。那通过反射API获得的那些annotation实例都是些什么东西呢?

那些annotation实例毫无疑问是Java对象。但它们到底是什么“类”的实例?是不是一定要在JVM内部提供特殊的支持?

Java的annotation没有行为,只能有数据,实际上就是一组键值对而已。通过解析(parse)Class文件就能把一个annotation需要的键值对都找出来。
于是问题就变成:
·有一个接口
·有一组键值对,它里面的数组能支持前面那个接口的功能
怎样才能把这个接口和这个map结合起来呢?

在[url=http://openjdk.java.net/]OpenJDK[/url] 6里,[url=http://hg.openjdk.java.net/jdk6/jdk6/jdk/file/506b35a2f558/src/share/classes/sun/reflect/annotation/AnnotationParser.java]sun.reflect.annotation.AnnotationParser[/url]的第254行:
/**
* Returns an annotation of the given type backed by the given
* member -> value map.
*/
public static Annotation annotationForMap(
Class type, Map<String, Object> memberValues)
{
return (Annotation) Proxy.newProxyInstance(
type.getClassLoader(), new Class[] { type },
new AnnotationInvocationHandler(type, memberValues));
}

(Oracle/Sun JDK 6同理)
这边的实现在HotSpot VM内部没啥特别支持,基本上就是在Java层把功能都实现出来了。

在[url=http://harmony.apache.org/]Apache Harmony[/url]里,[url=http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/drlvm/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/lang/annotation/AnnotationFactory.java?view=markup]org.apache.harmony.lang.annotation.AnnotationFactory[/url]的第195行
/*
* Provides a new annotation instance.
* @param annotationType the annotation type definition
* @param elements name-value pairs representing elements of the annotation
* @return a new annotation instance
*/
public static Annotation createAnnotation(
Class<? extends Annotation> annotationType,
AnnotationMember[] elements)
{
AnnotationFactory antn = new AnnotationFactory(annotationType, elements);
return (Annotation)Proxy.newProxyInstance( annotationType.getClassLoader(),
new Class[]{annotationType}, antn);
}

DRLVM周边的用于支持JDK核心类的native代码里确实有一些[url=http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/drlvm/vm/vmcore/src/reflection/annotations.cpp?view=markup]用来支持annotation的部分[/url],但并不是在DRLVM的核心里的。也就是说在JVM内部也没有为创建实际的annotation“类”提供特别功能。而且给人的感觉是它纯粹是为了避开与Sun JDK的相似性才用了这么奇怪的设计…

虽然具体实现不同,但两者都用了[url=http://download.oracle.com/javase/6/docs/api/java/lang/reflect/Proxy.html]动态代理[/url]。很直观对吧?

当然这不是唯一解法。我只是想说,首先不必纠结annotation到底是什么“类”的实例,反正背后多半就是个代理而已;其次,源码就在哪里,如果是针对某个实现想了解更多的话自己很容易就能找到答案… :oops:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值