国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java 中的Annotation

瀏覽:5日期:2024-06-17 08:05:07
內(nèi)容:

Java 中的Annotation

編者:管斌(http://blog.matrix.org.cn/page/guanbing)

在創(chuàng)建EJB組件時(shí),必需提供一些定義,使得EJB組件使用一些服務(wù)例如:安全服務(wù),持久化服務(wù),事務(wù)服務(wù)。EJB容器可以提供這些服務(wù),這樣EJB只要實(shí)現(xiàn)業(yè)務(wù)邏輯就可以了。但是說(shuō)到底EJB容器使用EJB組件的元數(shù)據(jù)來(lái)提供這些服務(wù),在以前EJB的元數(shù)據(jù)是以XML配置文件形式出現(xiàn)的,這些配置文件與EJB源文件是分開(kāi)的。EJB的部署人員無(wú)法了解EJB本身的信息,如果EJB組件的創(chuàng)建者用注釋(Annotation)的方法將這些配置服務(wù)的信息和代碼放在一起,這樣EJB的部署者就可以了解EJB的信息,EJB的home接口可以使用Annotation自動(dòng)生成,當(dāng)然到目前為止更好的是在簡(jiǎn)單的Java Object上使用Annotations。

一.什么是Annotation在已經(jīng)發(fā)布的JDK1.5(tiger)中增加新的特色叫 Annotation。Annotation提供一種機(jī)制,將程序的元素如:類(lèi),方法,屬性,參數(shù),本地變量,包和元數(shù)據(jù)聯(lián)系起來(lái)。這樣編譯器可以將元數(shù)據(jù)存儲(chǔ)在Class文件中。 這樣虛擬機(jī)和其它對(duì)象可以根據(jù)這些元數(shù)據(jù)來(lái)決定如何使用這些程序元素或改變它們的行為。

二.定義一個(gè)簡(jiǎn)單的Annotation并使用它1.定義Annotation定義一個(gè)Annotation是什么簡(jiǎn)單的,它采取的是類(lèi)似于Interface的定義方式: “@+annotation類(lèi)型名稱(chēng)+(..逗號(hào)分割的name-value對(duì)...)

//Example 1

package sz.starbex.bill.annotation;

import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;import java.lang.annotation.ElementType;@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface SimpleAnnotation { String value();}

@Retention這個(gè)meta-annotation表示我們創(chuàng)建的SimpleAnnotation這個(gè)Annotation將會(huì)存儲(chǔ)在Class文件中,并在java

VM運(yùn)行時(shí)加載它。@Target這個(gè)meta-annotation表示我們創(chuàng)建的SimplwAnnotation將會(huì)為描述方法,而@interface SimpleAnnotation是我們自定義的Annotation,它有一個(gè)成員叫value,返回值是String

2.使用Annotation

//Example 2package sz.starbex.bill.annotation;import sz.starbex.bill.annotation.SimpleAnnotation;public class UsingSimpleAnnotation { @SimpleAnnotation(value='Pass:This method will Pass')//注意name=value的用法 public void pass(){ if(10>5) System.out.println('測(cè)試通過(guò)'); } @SimpleAnnotation('Fail:This method will Fail')//注意name=value的用法 public void fail(){ if(10=0,當(dāng)只有一個(gè)單一的成員時(shí),這個(gè)成員就是value。我們也可以這樣寫(xiě) @SimpleAnnotation('Fail:This method will Fail')。至此@SimpleAnnotation將Pass和Fail聯(lián)系起來(lái)了。

3.在運(yùn)行時(shí)訪問(wèn)Annotation一旦Annotation與程序元素聯(lián)系起來(lái),我們可以通過(guò)反射訪問(wèn)它們并可以取得它們的值。我們使用一個(gè)新的interface:java.lang.reflect.AnnotatedElement。java.lang.reflect.AnnotatedElement接口中的方法有: a. boolean isAnnotationPresent(Class<? extends Annotation> annotationType) 如果指定類(lèi)型的注釋存在于此元素上,則返回 true,否則返回 false。 b. T getAnnotation(Class annotationType) 如果存在該元素的指定類(lèi)型的注釋?zhuān)瑒t返回這些注釋?zhuān)駝t返回 null。 c. Annotation[] getAnnotations() 返回此元素上存在的所有注釋。 d. Annotation[] getDeclaredAnnotations() 返回直接存在于此元素上的所有注釋。

你要注意 isAnnotationPresent和getAnnotation方法,它們使用了Generics,請(qǐng)參考我的Java 范型的Blog。下面我們列出一些實(shí)現(xiàn)了AnnotatedElement 接口的類(lèi)1. java.lang.reflect.AccessibleObject

2. java.lang.Class

3. java.lang.reflect.Constructor

4. java.lang.reflect.Field

5. java.lang.reflect.Method

6. java.lang.Package

下面的Example程序說(shuō)明了如何在運(yùn)行環(huán)境訪問(wèn)Annotation

package sz.starbex.bill.annotation;

import sz.starbex.bill.annotation.SimpleAnnotation;

import java.lang.reflect.Method;

public class SimpleAccessAnnotation { static void accessAnnotationTest(Class usingAnnnotationClass){ try { //Object usingAnnnotationClass=Class.forName(usingAnnotationClassName).newInstance(); Method [] methods=usingAnnnotationClass.getDeclaredMethods();//取得對(duì)方法 for(Method method:methods){ System.out.println(method.getName()); SimpleAnnotation

simpleAnnotation=method.getAnnotation(SimpleAnnotation.class);//得到方法的Annotation if(simpleAnnotation!=null){ System.out.print(simpleAnnotation.value()+'=='); String result=invoke(method,usingAnnnotationClass); System.out.println(result); } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } static String invoke(Method m, Object o) { String result = 'passed'; try { m.invoke(m,new Object[]{}); } catch (Exception e) { // TODO Auto-generated catch block result = 'failed'; } return result; }

/** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub accessAnnotationTest(UsingSimpleAnnotation.class); }

}

以上是簡(jiǎn)單的簡(jiǎn)紹Annotation,讓大家對(duì)Annotation有一個(gè)初步的了解,下面二會(huì)簡(jiǎn)紹Annotation的定義和語(yǔ)法

Java 中的Annotation的定義Java中的Annotation Java定義了幾個(gè)標(biāo)準(zhǔn)的meta-annotation.在新Package中java.lang.annotation 中包含了以下meta-annotation:meta-annotation 說(shuō)明@Target 1. annotation的target是一個(gè)被標(biāo)注的程序元素。target說(shuō)明了annotation所修飾的對(duì)象范圍:annotation可被用于packages、types(類(lèi)、接口、枚舉、annotation類(lèi)型)、類(lèi)型成員(方法、構(gòu)造方法、成員變量、枚舉值)、方法參數(shù)和本地變量(如循環(huán)變量、catch參數(shù))。在annotation類(lèi)型的聲明中使用了target可更加明晰其修飾的目標(biāo)。

<table cellspacing='0' cellpadding='0' border='1'> <tr style='mso-yfti-irow: 0; mso-yfti-firstrow: yes'> <td valign='top' width='117'>

meta-annotation

</td> <td valign='top' width='451'>

說(shuō)明

</td> </tr> <tr style='mso-yfti-irow: 1'> <td valign='top' width='117'>

@Target

</td> <td valign='top' width='451'>

1. annotation的target是一個(gè)被標(biāo)注的程序元素。target說(shuō)明了annotation所修飾的對(duì)象范圍:annotation可被用于packages、types(類(lèi)、接口、枚舉、annotation類(lèi)型)、類(lèi)型成員(方法、構(gòu)造方法、成員變量、枚舉值)、方法參數(shù)和本地變量(如循環(huán)變量、catch參數(shù))。在annotation類(lèi)型的聲明中使用了target可更加明晰其修飾的目標(biāo)。

2. ElementType的定義

TYPE // Class, interface, or enum (but not annotation)

FIELD// Field (including enumerated values)

METHOD// Method (does not include constructors)

PARAMETER// Method parameter

CONSTRUCTOR// Constructor

LOCAL_VARIABLE// Local variable or catch clause

ANNOTATION_TYPE// Annotation Types (meta-annotations)

PACKAGE// Java package

</td> </tr> <tr style='mso-yfti-irow: 2'> <td valign='top' width='117'>

@Retention

</td> <td valign='top' width='451'>

1. SOURCE//按照規(guī)定使用注釋?zhuān)遣⒉粚⑺A舻骄幾g后的類(lèi)文件中

2. CLASS//將注釋保留在編譯后的類(lèi)文件中,但是在運(yùn)行時(shí)忽略它

3. RUNTIME//將注釋保留在編譯后的類(lèi)文件中,并在第一次加載類(lèi)時(shí)讀取它

</td> </tr> <tr style='mso-yfti-irow: 3'> <td valign='top' width='117'>

@Documented

</td> <td valign='top' width='451'>

Documented 表示注釋?xiě)?yīng)該出現(xiàn)在類(lèi)的 Javadoc 中

</td> </tr> <tr style='mso-yfti-irow: 4; mso-yfti-lastrow: yes'> <td valign='top' width='117'>

@Inherited

</td> <td valign='top' width='451'>

一個(gè)Annotation將被繼承

</td> </tr> </table>

三個(gè)標(biāo)準(zhǔn)的Annotation 在java.lang包中:

<table cellspacing='0' cellpadding='0' border='1'> <tr style='mso-yfti-irow: 0; mso-yfti-firstrow: yes'> <td valign='top' width='284'>

@Deprecated

</td> <td valign='top' width='284'>

對(duì)不再使用的方法進(jìn)行注釋

</td> </tr> <tr style='mso-yfti-irow: 1'> <td valign='top' width='284'>

@Override

</td> <td valign='top' width='284'>

指明注釋的方法覆蓋超類(lèi)的方法

</td> </tr> <tr style='mso-yfti-irow: 2; mso-yfti-lastrow: yes'> <td valign='top' width='284'>

@SuppressWarnings

</td> <td valign='top' width='284'>

阻止編譯器的警告,例:當(dāng)類(lèi)型不安全時(shí)

</td> </tr> </table>

下例來(lái)說(shuō)明這三個(gè)標(biāo)準(zhǔn)的Annotation:package sz.starbex.bill.annotation;import java.util.ArrayList;import java.util.List;public class SimpleOverrideAnnotation { public static void main(String[] args) { SimpleOverrideAnnotation test = new SimpleOverrideAnnotation(); System.out.println(test.toString()); } @Override public String toString() { return '自己的類(lèi)自己輸出'; } @Deprecated public void doSomething() { System.out.println('方法已過(guò)時(shí)' ); } @SuppressWarnings(value={'unchecked'}) public void testSuppressWarnings(){ List testList=new ArrayList(); testList.add('KKKK');//沒(méi)有使用范型,類(lèi)型不安全 }}

Annotation使用實(shí)例1.一個(gè)組合的Annotation,注釋類(lèi)的 a. 商標(biāo)Annotation package sz.starbex.bill.annotation; public @interface Trademark { String name(); String owner(); } b.License的annotation package sz.starbex.bill.annotation; import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.PACKAGE}) public @interface License { String name(); String notice(); boolean redistributable(); Trademark[] trademarks(); } c.測(cè)試類(lèi) package sz.starbex.bill.annotation; @License(name='Bill', notice='許可證', redistributable=true, trademarks={@Trademark(name='Mercedes',owner='Swedish'), @Trademark(name='Daewoo',owner='Korean') } ) public class TestLicenseAnnotation { public static void main(String[] args) { TestLicenseAnnotation test=new TestLicenseAnnotation(); License license=test.getClass().getAnnotation(License.class); System.out.println('License發(fā)放人:'+license.name()); System.out.println('License注意事項(xiàng):'+license.notice()); System.out.println('License許可:'+license.redistributable()); Trademark [] marks=license.trademarks(); for(Trademark mark:marks){ System.out.println('商標(biāo)名稱(chēng):'+mark.name()); System.out.println('商標(biāo)的使用者:'+mark.owner()); } }

}

<?php wp_link_pages(); ?>

<?php trackback_rdf(); ?> Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 日韩美女在线看免费观看 | 久久综合精品国产一区二区三区无 | 日韩欧美三级在线观看 | 超清波多野结衣精品一区 | 亚洲国产成人久久一区二区三区 | 久草在在线视频免费 | 国产91免费在线 | 被老外玩爽的中国美女视频 | 国产一区二区三区毛片 | a在线v | 青青操网站 | 亚洲精品a | 成 人 黄 色 免费网 | 国产精品中文 | 国产精品久久做爰 | 亚洲线精品一区二区三区 | 国产精选一区二区 | 亚洲精品国产成人一区二区 | 97国产大学生情侣11在线视频 | 欧美三级一区二区 | 亚洲韩精品欧美一区二区三区 | 精品国产亚洲人成在线 | 免费观看欧美性一级 | 久热香蕉精品视频在线播放 | xx69欧美| 免费观看一级特黄三大片视频 | 亚洲精品一 | 日本一区二区三区欧美在线观看 | 国产欧美网站 | 久草欧美视频 | 欧美另类69xxxxx视频 | 黄色w站| 亚洲欧美视频网站 | 男人的天堂免费网站 | 日韩伦理一区二区三区 | 欧美激情综合亚洲五月蜜桃 | 亚洲午夜久久久久国产 | 成人在线免费观看视频 | 国产精品久久久久久久久久久不卡 | 日韩免费一区二区三区 | 在线观看一区二区三区视频 |