`
RednaxelaFX
  • 浏览: 3049017 次
  • 性别: 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

    【Java Annotation 实例】 Java Annotation 是一种元数据,它允许我们在源代码中嵌入信息,这些信息可以被编译器或运行时环境用于处理代码。Annotation 不是代码本身,但可以影响代码的行为或提供编译时和运行时的...

    java annotation 实例

    Java注解(Annotation)是Java语言提供的一种元数据机制,用于在代码中插入额外的信息,这些信息可以被编译器或运行时环境读取。它们主要用于简化代码的维护、提高可读性,以及实现编译时和运行时的检查。在本实例中...

    Java Annotation的讲解和例子

    Java 注解(Annotation)是Java语言的一个重要特性,它为代码提供元数据,即关于代码的信息,但这些信息不直接影响程序的运行。注解在Java中主要用于编译器检查、运行时处理、框架生成元数据等场景。本篇将深入探讨...

    Java实例化一个抽象类对象的方法教程

    总的来说,虽然Java中的抽象类不能直接实例化,但我们可以通过继承并实现其抽象方法,或者利用字节码工具和注解处理器在运行时或编译时动态生成新的类来间接达到实例化抽象类的目的。这样的设计允许我们创建更加灵活...

    Java 注解Annotation实例上手文档

    ### Java 注解Annotation实例上手文档 #### 一、引言与基础知识 Java注解(Annotation)自JDK 5.0引入以来,已经成为Java语言的重要特性之一,它为代码元数据提供了一种标准化的方式,使得编译器、工具和其他框架...

    什么是Annotation?

    ### 什么是Annotation? #### 一、Annotation的概念 在Java 1.5版本中引入了一个重要的新特性——**Annotation**(注解)。Annotation本质上是一种元数据(即关于数据的数据),它提供了一种机制来关联程序元素...

    Java JDK 实例开发宝典

    接着,通过一系列精心设计的实例,你可以了解到Java语法基础,包括数据类型、控制流、类和对象、接口、包的使用等。这些实例将帮助你构建起坚实的Java编程基础。 JDK中的核心类库是Java的强大之处,书中的实例将带...

    安卓Annotation实例

    在这个“安卓Annotation实例”中,我们将探讨如何在Android项目中创建和使用自定义的注解。 1. **注解的基础概念** - 注解是一种特殊的声明,可以被JVM或编译器读取,但它们不会直接影响程序的执行。 - Android中...

    Java annotation元注解原理实例解析

    Java Annotation元注解原理实例解析 Java annotation是Java语言中的一种元编程技术,用于在编译期或运行期提供元数据,以便简化代码、提高开发效率和程序的可读性。在这篇文章中,我们将深入探讨Java annotation的...

    Java常用实例程序

    对象则是类的实例,可以调用类中定义的方法。 3. **封装、继承和多态**:这是面向对象编程的三大特性。封装隐藏了对象内部的细节,提供公共接口供外部访问;继承允许子类继承父类的属性和方法,实现代码复用;多态...

    java jdk 实例宝典 源代码

    Java JDK实例宝典源代码是Java开发者的重要参考资料,它涵盖了JDK中的各种核心类库、API及其实现机制。这份源代码提供了丰富的示例,帮助开发者深入理解Java语言的使用和内部工作原理。通过研究这些实例,我们可以...

    Android Annotation 安卓注解实例

    通过使用Java的APT(Annotation Processing Tool),在编译阶段,注解处理器会读取源代码中的注解,生成对应的辅助类或方法,从而在运行时提高效率。 7. **错误检查和代码质量** 使用注解还可以帮助编译器进行静态...

    java反射经典实例

    在本“Java反射经典实例”中,我们将深入探讨这个主题,了解如何利用反射来访问和修改私有属性以及调用私有方法。 1. **反射的概念与用途** - 反射机制是在运行时分析类的能力,它允许我们获取类的信息(如类名、...

    JAVA编程实例大全及详解答案(50例)

    本资源"JAVA编程实例大全及详解答案(50例)"显然是为了帮助初学者和有经验的开发者深入理解Java语言并提升编程技能。通过50个具体的实例,读者可以学习到如何解决实际问题,理解各种编程概念,并且每个实例都提供了...

    annotationProcessor实例demo

    在Java开发中,`AnnotationProcessor` 是一个强大的工具,它允许开发者在编译期间自动处理源代码,根据注解(Annotation)生成额外的类或修改已有类。这个过程被称为注解处理,是Java编译器的一部分,可以在不需人工...

    Java教材实例代码

    实例化一个类可以创建对象,对象是类的具体实例。理解类的构造器、属性和方法是非常重要的。 3. **继承与多态**:继承允许子类继承父类的属性和方法,增强了代码的重用性。多态则是同一接口下不同类的行为差异,...

Global site tag (gtag.js) - Google Analytics