用户操作
[即时聊天] [发私信] [加为好友]
Anders小明ID:lins
94800次访问,排名1035,好友0人,关注者6人。
一个无知IT人的无责任空间

架构解决问题;技术服务业务;ROI高才是王道!
lins的文章
原创 66 篇
翻译 0 篇
转载 9 篇
评论 32 篇
Anders小明的公告
架构解决问题;技术服务业务;ROI高才是王道!!
Google Page Rank

Anders小明的其它博客

Google的广告



最近评论
modernmm:GOOD
zhumc:我理解的业务流程为了:1.流程页面层,收集页面的信息并展示信息;2.流程定义层,定义流程的业务模型;3.流程引挚层,控制并计算流程的各种算法.

E8.Net工作流平台 提升企业战略执行力
ITIL与ITSM QQ群3:48132184
.NET开发与工作流2 QQ群:53284682 http://www.feifanit.com.cn
xp1204:理解意思,
表叙不太清晰,哈哈,还是学习了。
xiaobingyang:请使用中国人开发的C/C++编译器、网页浏览器内核
该软件下载地址:
http://www.nila.com.cn/yczip.zip
lins:今天又仔细看了一下C# 3.0 specification,编译器能做的事还真不少。玩着各种各样的花样,又可以减少代码提高效率,特别是一些特性支持关注点的分离,有助于模型的设计。
文章分类
收藏
相册
Google Cluster
朋友的Blog
buaawhl
partech
江南白衣
超越黎明
非鱼
推荐的网站
捷道·敏捷堂
存档
订阅我的博客
XML聚合  FeedSky

原创 MetaData Programme收藏

新一篇: Template和JSP技术 | 旧一篇: ONJava: Designing a Fully Scalable Application

(本文发于java emag第二期)
什么是元数据编程

什么是元数据,元数据就是描述数据的数据(data about data)。最明显的例子是XML Schemaxml schema就是描述xml的数据,所以它是元数据。另一个例子是数据库,比如我们可以查询数据库中有几个表,每个表都有什么字段,这些数据就是元数据。

在开发的世界里,元数据就是能够绑定到一个类的附加信息,在静态或者运行时间。JCR175给我们提供annotation就是一种元数据。

不过在这之前一个我们已经广泛使用的元数据是XML,如就是EJBXML发布描述符中,你需要定义基于每一个方法的事务属性。应用服务器指导什么时候,什么地方开始,挂起或者提交一个事务,因为你在BEANXML的配置文件中的元数据内已经定义如方法:RequiredRequiresNewSupport等等,它们绑定在你的EJB类和事务管理之间。XDoclet是另一个元数据的例子。

 

Annotation的意义和简单例子

    JDK1.5提供的annotation与我们所常见的classesfieldssmethods间是什么关系。如下:如果说类和数据成员是名词,方法是动词,那么annotation就是形容词或者副词,分别描述它们的所具有属性。

好,现在就来实现一个annotation

import java.lang.annotation.Retention;

package sample.annotation

@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)

    public @interface Broker {

        String name();

        String address();

    }

}

使用这个annotation

Import sample.annotation.broker

@Broker(name="anders", address="xiamen")

public class Agent {

    public String getTelPhone (){

       return  "010-0592-2519280";

    }

}

运行期得到这个annotation

public class Main {

    public static void main(String[] args){

Agent agent = new Agent();

        try{

            Annotation[] a = agent.getClass().getMethod("getBrokerName").getAnnotations();

            for (int i=0; i<a.length ; i++)  {

                 if( a[i] instanceof Broker){

                      Broker broker = (Broker)a[i];

                     System.out.println(broker.name());

                 }

             }

        }

        catch(Exception e){

            e.printStackTrace(System.out);

        }

   }

}

 

Annotationclass文件格式

    利用sun公司的提供的javap,我们可以看到annotation的在class文件中的表示。以下为对比结果:

源码:

@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)

public @interface Broker {

    String name();

    String address();

}

Javap结果:

Compiled from "Broker.java"

interface Broker extends java.lang.annotation.Annotation

  SourceFile: "Broker.java"

  minor version: 0

  major version: 0

  Constant pool:

const #1 = class    #9;  // Broker

const #2 = class    #10; // Object

const #3 = class    #11; //Annotation

const #4 = Asciz    name;

const #5 = Asciz   ()Ljava/lang/String;;

const #6 = Asciz    address;

const #7 = Asciz    SourceFile;

const #8 = Asciz    Broker.java;

const #9 = Asciz    Broker;

const #10 = Asciz   java/lang/Object;

const #11 = Asciz   java/lang/annotation/Annotation;

 

{

public abstract java.lang.String name();

 

public abstract java.lang.String address();

}

源码:

public interface Broker {

    String name();

    String address();

}

Javap结果:

Compiled from "Broker.java"

interface Broker

  SourceFile: "Broker.java"

  minor version: 0

  major version: 0

  Constant pool:

const #1 = class    #8; //  Broker

const #2 = class    #9; //  Object

const #3 = Asciz    name;

const #4 = Asciz    ()Ljava/lang/String;;

const #5 = Asciz    address;

const #6 = Asciz    SourceFile;

const #7 = Asciz    Broker.java;

const #8 = Asciz    Broker;

const #9 = Asciz    java/lang/Object;

 

{

public abstract java.lang.String name();

 

public abstract java.lang.String address();

 

}

源码:

@Broker(name="anders", address="xiamen")

public class Agent {

    public String getTelPhone(){

        return  "0592-2519580";

    }

}

Javap结果:

Compiled from "Agent.java"

public class Agent extends java.lang.Object

  SourceFile: "Agent.java"

  RuntimeVisibleAnnotations: length = 0x10

   00 01 00 11 00 02 00 12 73 00 13 00 14 73 00 15

  

  minor version: 0

  major version: 0

  Constant pool:

const #1 = Method   #4.#22; //  java/lang/Object."<init>":()V

const #2 = String   #23;    //  0592-2519580

const #3 = class    #24;    //  Agent

const #4 = class    #25;    //  Object

const #5 = Asciz    <init>;

const #6 = Asciz    ()V;

const #7 = Asciz    Code;

const #8 = Asciz    LineNumberTable;

const #9 = Asciz    LocalVariableTable;

const #10 = Asciz   this;

const #11 = Asciz   LAgent;;

const #12 = Asciz   getTelPhone;

const #13 = Asciz   ()Ljava/lang/String;;

const #14 = Asciz   SourceFile;

const #15 = Asciz   Agent.java;

const #16 = Asciz   RuntimeVisibleAnnotations;

const #17 = Asciz   LBroker;;

const #18 = Asciz   name;

const #19 = Asciz   anders;

const #20 = Asciz   address;

const #21 = Asciz   xiamen;

const #22 = NameAndType #5:#6;//  "<init>":()V

const #23 = Asciz   0592-2519580;

const #24 = Asciz   Agent;

const #25 = Asciz   java/lang/Object;

 

// 以下为方法域,略

源码:

public class Agent {

    public String getTelPhone(){

        return  "0592-2519580";

    }

}

Javap结果:

Compiled from "Agent.java"

public class Agent extends java.lang.Object

  SourceFile: "Agent.java"

  minor version: 0

  major version: 0

  Constant pool:

const #1 = Method   #4.#16;    //  java/lang/Object."<init>":()V

const #2 = String   #17;    //  0592-2519580

const #3 = class    #18;    //  Agent

const #4 = class    #19;    //  Object

const #5 = Asciz    <init>;

const #6 = Asciz    ()V;

const #7 = Asciz    Code;

const #8 = Asciz    LineNumberTable;

const #9 = Asciz    LocalVariableTable;

const #10 = Asciz   this;

const #11 = Asciz   LAgent;;

const #12 = Asciz    getTelPhone;

const #13 = Asciz    ()Ljava/lang/String;;

const #14 = Asciz    SourceFile;

const #15 = Asciz    Agent.java;

const #16 = NameAndType    #5:#6;//  "<init>":()V

const #17 = Asciz    0592-2519580;

const #18 = Asciz   Agent;

const #19 = Asciz    java/lang/Object;

 

// 以下为方法域,略

 

补充说明:我们都知道在java 1.0发布时,java class file的格式就已经定下来,要说明的是为了应未来的需要java class file设计了属性说的机制。一直到j2se1.4都没有怎么改变。但这次为了更好的支持metadata技术,一共增加了8个属性。分別是:

·           EnclosingMethod AttributeAnonymous Class Local Inner Class 使用此 Attribute 描述该Class Scope

·           Signature AttributeGenerics ClassMethod、或 Filed使用此 Attribute 来记录所要的类型,因为java的范型采用了擦拭法。

·           LocalVariableTypeTable Attribute:主要是給 debugger 使用,目的和「LocalVariableTable Attribute类似,只是「LocalVariableTable Attribute 记录所要的参数表,而「LocalVariableTypeTable Attribute 记录参数的类型。

·           RuntimeVisibleAnnotations Attribute:确定该annotation可以被reflectionAPI返回,适用对象:ClassMethodField

·           RuntimeInvisibleAnnotations Attribute:确定该annotation无法被reflectionAPI返回,适用对象: ClassMethodField  

·           RuntimeVisibleParameterAnnotations Attribute同「RuntimeVisibleAnnotations Attribute,适用对象:Method,(该Method 的参数

·           RuntimeInvisibleParameterAnnotations Attribute同「RuntimeInvisibleAnnotations Attribute,适用对象:Method,(该Method 的参数。

·           AnnotationDefault Attribute适用对象:Method,记录默认值。

 

 

为什么