`
RednaxelaFX
  • 浏览: 3014900 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

Java annotation的实例是什么类的?

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

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

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

OpenJDK 6里,sun.reflect.annotation.AnnotationParser的第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层把功能都实现出来了。

Apache Harmony里,org.apache.harmony.lang.annotation.AnnotationFactory的第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代码里确实有一些用来支持annotation的部分,但并不是在DRLVM的核心里的。也就是说在JVM内部也没有为创建实际的annotation“类”提供特别功能。而且给人的感觉是它纯粹是为了避开与Sun JDK的相似性才用了这么奇怪的设计…

虽然具体实现不同,但两者都用了动态代理。很直观对吧?

当然这不是唯一解法。我只是想说,首先不必纠结annotation到底是什么“类”的实例,反正背后多半就是个代理而已;其次,源码就在哪里,如果是针对某个实现想了解更多的话自己很容易就能找到答案…
分享到:
评论
4 楼 RednaxelaFX 2011-08-15  
richard_2010 写道
RednaxelaFX 写道
richard_2010 写道
“Java的annotation没有行为,只能有数据”
--jdk怎么实现我自定义的注解功能的?

“如何实现”是指?这个问题很大……


写篇博客讲解下?

不,太麻烦了。除非有明确的问题点不然我不想拿这么“大”的题目来讲
3 楼 richard_2010 2011-08-15  
RednaxelaFX 写道
richard_2010 写道
“Java的annotation没有行为,只能有数据”
--jdk怎么实现我自定义的注解功能的?

“如何实现”是指?这个问题很大……


写篇博客讲解下?
2 楼 RednaxelaFX 2011-08-15  
richard_2010 写道
“Java的annotation没有行为,只能有数据”
--jdk怎么实现我自定义的注解功能的?

“如何实现”是指?这个问题很大……
1 楼 richard_2010 2011-08-15  
“Java的annotation没有行为,只能有数据”
--jdk怎么实现我自定义的注解功能的?

相关推荐

    JavaAnnotation实例.docx

    JavaAnnotation实例.docx

    Java Annotation的讲解和例子

    Java Annotation的讲解和例子~~~

    java annotation 实例

    NULL 博文链接:https://pan-java.iteye.com/blog/335134

    java annotation 从入门到精通 包含实例

    java annotation 从JDK5.0后提供的功能。里面包含的实例,我是为了学习这个,所以放到这个上面作为中转。从别人博客里面摘取,博客地址里面附有。

    Java 注解Annotation实例上手文档

    新手学Java注解的最好资料,15分钟迅速开发

    JAVA上百实例源码以及开源项目源代码

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    Java annotation元注解原理实例解析

    主要介绍了Java annotation元注解原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java Annotation详解及实例代码

    主要介绍了Java Annotation详解及实例代码的相关资料,需要的朋友可以参考下

    JAVA上百实例源码以及开源项目

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    Java JDK实例宝典

    全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...

    Vue调用后端java接口的实例代码

    前段时间 做了个学校的春萌项目,其中用到vue连接后端java接口。 先上后端接口代码: package controller; import net.sf.json.JSONObject; import util.DBUtil; import javax.servlet.ServletException; import ...

    java高手真经 光盘源码

    java高手真经 全光盘源代码 打包rar 第1部分(2个程序包) HelloWorld.zip 01.Java入门样例HelloWorld demo.zip 03.Eclipse入门样例...javaannotation.zip 28.Java注释符编程 javafeature.zip 29.Java5.0语言新特性

    Java高手真经(编程基础卷)光盘全部源码 免积分

    看到那些要积分的很不酸,发布免费版本。 第1部分(2个程序包) HelloWorld.zip 01.Java入门样例HelloWorld demo.zip 03.Eclipse入门...javaannotation.zip 28.Java注释符编程 javafeature.zip 29.Java5.0语言新特性

    Java高手真经(编程基础卷)光盘全部源码

    看到很多人都分卷打包的,下载很是不方便,还浪费积分,我就整合压缩打包到一个包里面,里面包含全部源码 源码目录如下: ...javaannotation.zip 28.Java注释符编程 javafeature.zip 29.Java5.0语言新特性

    Annotation-Builder:从 Java 中的注解接口轻松创建实例

    注释生成器在 Java 中轻松创建注释实例例子: @interface MyAnnon { String SomeValue () default "has default"; int SomeInt (); // No default value.}// ...@MyAnnon ( SomeInt = 99 )public class DummyClass {...

    Java开发详解.zip

    020505_〖第5章:面向对象基础〗_实例讲解—类设计分析(学生类)笔记.pdf 020506_【第5章:面向对象基础】_String类笔记.pdf 020507_【第5章:面向对象基础】_String类的常用方法.pdf 020508_【第5章:面向对象基础...

Global site tag (gtag.js) - Google Analytics