- 浏览: 3049074 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
Java里annotation看起来就像接口一般。如果跟接口一样的话,那肯定不能直接生成实例。那通过反射API获得的那些annotation实例都是些什么东西呢?
那些annotation实例毫无疑问是Java对象。但它们到底是什么“类”的实例?是不是一定要在JVM内部提供特殊的支持?
Java的annotation没有行为,只能有数据,实际上就是一组键值对而已。通过解析(parse)Class文件就能把一个annotation需要的键值对都找出来。
于是问题就变成:
·有一个接口
·有一组键值对,它里面的数组能支持前面那个接口的功能
怎样才能把这个接口和这个map结合起来呢?
在OpenJDK 6里,sun.reflect.annotation.AnnotationParser的第254行:
(Oracle/Sun JDK 6同理)
这边的实现在HotSpot VM内部没啥特别支持,基本上就是在Java层把功能都实现出来了。
在Apache Harmony里,org.apache.harmony.lang.annotation.AnnotationFactory的第195行
DRLVM周边的用于支持JDK核心类的native代码里确实有一些用来支持annotation的部分,但并不是在DRLVM的核心里的。也就是说在JVM内部也没有为创建实际的annotation“类”提供特别功能。而且给人的感觉是它纯粹是为了避开与Sun JDK的相似性才用了这么奇怪的设计…
虽然具体实现不同,但两者都用了动态代理。很直观对吧?
当然这不是唯一解法。我只是想说,首先不必纠结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怎么实现我自定义的注解功能的?
--jdk怎么实现我自定义的注解功能的?
“如何实现”是指?这个问题很大……
写篇博客讲解下?
不,太麻烦了。除非有明确的问题点不然我不想拿这么“大”的题目来讲
3 楼
richard_2010
2011-08-15
RednaxelaFX 写道
richard_2010 写道
“Java的annotation没有行为,只能有数据”
--jdk怎么实现我自定义的注解功能的?
--jdk怎么实现我自定义的注解功能的?
“如何实现”是指?这个问题很大……
写篇博客讲解下?
2 楼
RednaxelaFX
2011-08-15
richard_2010 写道
“Java的annotation没有行为,只能有数据”
--jdk怎么实现我自定义的注解功能的?
--jdk怎么实现我自定义的注解功能的?
“如何实现”是指?这个问题很大……
1 楼
richard_2010
2011-08-15
“Java的annotation没有行为,只能有数据”
--jdk怎么实现我自定义的注解功能的?
--jdk怎么实现我自定义的注解功能的?
发表评论
-
The Prehistory of Java, HotSpot and Train
2014-06-02 08:18 0http://cs.gmu.edu/cne/itcore/vi ... -
MSJVM and Sun 1.0.x/1.1.x
2014-05-20 18:50 0当年的survey paper: http://www.sym ... -
Sun JDK1.4.2_28有TieredCompilation
2014-05-12 08:48 0原来以前Sun的JDK 1.4.2 update 28就已经有 ... -
IBM JVM notes (2014 ver)
2014-05-11 07:16 0Sovereign JIT http://publib.bou ... -
class data sharing by Apple
2014-03-28 05:17 0class data sharing is implement ... -
Java 8与静态工具类
2014-03-19 08:43 16278以前要在Java里实现所谓“静态工具类”(static uti ... -
Java 8的default method与method resolution
2014-03-19 02:23 10453先看看下面这个代码例子, interface IFoo { ... -
HotSpot Server VM与Server Class Machine
2014-02-18 13:21 0HotSpot VM历来有Client VM与Server V ... -
Java 8的lambda表达式在OpenJDK8中的实现
2014-02-04 12:08 0三月份JDK8就要发布首发了,现在JDK8 release c ... -
GC stack map与deopt stack map的异同
2014-01-08 09:56 0两者之间不并存在包含关系。它们有交集,但也各自有特别的地方。 ... -
HotSpot Server Compiler与data-flow analysis
2014-01-07 17:41 0http://en.wikipedia.org/wiki/Da ... -
字符串的一般封装方式的内存布局 (1): 元数据与字符串内容,整体还是分离?
2013-11-07 17:44 22395(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局
2013-11-01 12:55 0(Disclaimer:未经许可请 ... -
关于string,内存布局,C++ std::string,CoW
2013-10-30 20:45 0(Disclaimer:未经许可请 ... -
对C语义的for循环的基本代码生成模式
2013-10-19 23:12 21874之前有同学在做龙书(第二版)题目,做到8.4的练习,跟我对答案 ... -
Java的instanceof是如何实现的
2013-09-22 16:57 0Java语言规范,Java SE 7版 http://docs ... -
oop、klass、handle的关系
2013-07-30 17:34 0oopDesc及其子类的实例 oop : oopDesc* ... -
Nashorn各种笔记
2013-07-15 17:03 0http://bits.netbeans.org/netbea ... -
《深入理解Java虚拟机(第二版)》书评
2013-07-08 19:19 0值得推荐的中文Java虚拟机入门书 感谢作者赠与的样书,以下 ... -
豆列:从表到里学习JVM实现
2013-06-13 14:13 48367刚写了个学习JVM用的豆列跟大家分享。 豆列地址:http: ...
相关推荐
【Java Annotation 实例】 Java Annotation 是一种元数据,它允许我们在源代码中嵌入信息,这些信息可以被编译器或运行时环境用于处理代码。Annotation 不是代码本身,但可以影响代码的行为或提供编译时和运行时的...
Java注解(Annotation)是Java语言提供的一种元数据机制,用于在代码中插入额外的信息,这些信息可以被编译器或运行时环境读取。它们主要用于简化代码的维护、提高可读性,以及实现编译时和运行时的检查。在本实例中...
Java 注解(Annotation)是Java语言的一个重要特性,它为代码提供元数据,即关于代码的信息,但这些信息不直接影响程序的运行。注解在Java中主要用于编译器检查、运行时处理、框架生成元数据等场景。本篇将深入探讨...
总的来说,虽然Java中的抽象类不能直接实例化,但我们可以通过继承并实现其抽象方法,或者利用字节码工具和注解处理器在运行时或编译时动态生成新的类来间接达到实例化抽象类的目的。这样的设计允许我们创建更加灵活...
### Java 注解Annotation实例上手文档 #### 一、引言与基础知识 Java注解(Annotation)自JDK 5.0引入以来,已经成为Java语言的重要特性之一,它为代码元数据提供了一种标准化的方式,使得编译器、工具和其他框架...
### 什么是Annotation? #### 一、Annotation的概念 在Java 1.5版本中引入了一个重要的新特性——**Annotation**(注解)。Annotation本质上是一种元数据(即关于数据的数据),它提供了一种机制来关联程序元素...
接着,通过一系列精心设计的实例,你可以了解到Java语法基础,包括数据类型、控制流、类和对象、接口、包的使用等。这些实例将帮助你构建起坚实的Java编程基础。 JDK中的核心类库是Java的强大之处,书中的实例将带...
在这个“安卓Annotation实例”中,我们将探讨如何在Android项目中创建和使用自定义的注解。 1. **注解的基础概念** - 注解是一种特殊的声明,可以被JVM或编译器读取,但它们不会直接影响程序的执行。 - Android中...
Java Annotation元注解原理实例解析 Java annotation是Java语言中的一种元编程技术,用于在编译期或运行期提供元数据,以便简化代码、提高开发效率和程序的可读性。在这篇文章中,我们将深入探讨Java annotation的...
对象则是类的实例,可以调用类中定义的方法。 3. **封装、继承和多态**:这是面向对象编程的三大特性。封装隐藏了对象内部的细节,提供公共接口供外部访问;继承允许子类继承父类的属性和方法,实现代码复用;多态...
Java JDK实例宝典源代码是Java开发者的重要参考资料,它涵盖了JDK中的各种核心类库、API及其实现机制。这份源代码提供了丰富的示例,帮助开发者深入理解Java语言的使用和内部工作原理。通过研究这些实例,我们可以...
通过使用Java的APT(Annotation Processing Tool),在编译阶段,注解处理器会读取源代码中的注解,生成对应的辅助类或方法,从而在运行时提高效率。 7. **错误检查和代码质量** 使用注解还可以帮助编译器进行静态...
在本“Java反射经典实例”中,我们将深入探讨这个主题,了解如何利用反射来访问和修改私有属性以及调用私有方法。 1. **反射的概念与用途** - 反射机制是在运行时分析类的能力,它允许我们获取类的信息(如类名、...
本资源"JAVA编程实例大全及详解答案(50例)"显然是为了帮助初学者和有经验的开发者深入理解Java语言并提升编程技能。通过50个具体的实例,读者可以学习到如何解决实际问题,理解各种编程概念,并且每个实例都提供了...
在Java开发中,`AnnotationProcessor` 是一个强大的工具,它允许开发者在编译期间自动处理源代码,根据注解(Annotation)生成额外的类或修改已有类。这个过程被称为注解处理,是Java编译器的一部分,可以在不需人工...
实例化一个类可以创建对象,对象是类的具体实例。理解类的构造器、属性和方法是非常重要的。 3. **继承与多态**:继承允许子类继承父类的属性和方法,增强了代码的重用性。多态则是同一接口下不同类的行为差异,...