什么是注解 java,java注解是怎么实现的
各位老铁们,大家好,今天由我来为大家分享什么是注解 java,以及java注解是怎么实现的的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!
java 注解都有哪些东西
Java注解相当于对类或者方法或者变量额外的注释(标识)。以下是转载
-------------------------------------------------------
Annotation是Java5、6只后的新特征(中文称之为注解),并且越来越多的得到了应用,比如Spring、Hibernate3、Struts2、iBatis3、JPA、JUnit等等都得到了广泛应用,通过使用注解,代码的灵活性大大提高。
这些都是使用别人定义的注解,一般注解的使用都是在一些基础框架或者类库中来定义的,因此很少见过有人自己去写一个注解出来并使用在程序中,因此注解的使用常常给人感觉很神秘,这就为你揭开注解的面纱。
注解的神秘之处在于:通过类似注释的方式,可以控制程序的一些行为,运行时的状态,可以为成员赋值,做配置信息等等,与常规编码思维大相径庭。
只用别人定义好的注解是搞不懂这些问题的,要想真正知道注解内部的秘密,要自己定义注解,然后在程序中获取注解信息,拿到注解信息后,就可以为我所用了。
下面我简单演示下三类注解的用法:类注解、方法注解、字段(也称之域)注解的定义与适用,并看看如何获取注解的信息。
一、定义注解
package lavasoft.anntest;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
*类注解
*
*@author leizhimin 2009-12-18 14:15:46
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public@interface MyAnnotation4Class{
public String msg();
}
package lavasoft.anntest;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
*方法注解
*
*@author leizhimin 2009-12-18 14:16:05
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public@interface MyAnnotation4Method{
public String msg1();
public String msg2();
}
package lavasoft.anntest;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
*字段注解
*
*@author leizhimin 2009-12-18 15:23:12
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public@interface MyAnnotation4Field{
public String commont();
public boolean request();
}
二、写一个类,用上这些注解
package lavasoft.anntest;
/**
*一个普通的Java类
*/
@MyAnnotation4Class(msg="测试类注解信息")
class TestClass{
@MyAnnotation4Field(commont="成员变量的注解信息", request= true)
private String testfield;
@MyAnnotation4Method(msg1="测试方法注解信息1", msg2="测试方法注解信息2")
public void testMethod(){
System.out.println("Hello World!");
}
}
三、测试注解
为了使用注解,需要通过反射获取注解的对象。通过注解对象来操作注解信息。
package lavasoft.anntest;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
*测试类
*
*@author leizhimin 2009-12-18 14:13:02
*/
public class TestOptAnnotation{
public static void main(String[] args) throws NoSuchMethodException, NoSuchFieldException{
TestClass t= new TestClass();
System.out.println("-----------MyAnnotation4Class注解信息---------");
MyAnnotation4Class an4clazz= t.getClass().getAnnotation(MyAnnotation4Class.class);
System.out.println(an4clazz.msg());
System.out.println("-----------MyAnnotation4Method注解信息---------");
Method method= t.getClass().getMethod("testMethod", new Class[0]);
MyAnnotation4Method an4method= method.getAnnotation(MyAnnotation4Method.class);
System.out.println(an4method.msg1());
System.out.println(an4method.msg2());
System.out.println("-----------MyAnnotation4Field注解信息---------");
Field field= t.getClass().getDeclaredField("testfield");
MyAnnotation4Field an4field= field.getAnnotation(MyAnnotation4Field.class);
System.out.println(an4field.commont());
System.out.println(an4field.request());
}
}
运行结果:
-----------MyAnnotation4Class注解信息---------
测试类注解信息
-----------MyAnnotation4Method注解信息---------
测试方法注解信息1
测试方法注解信息2
-----------MyAnnotation4Field注解信息---------
成员变量的注解信息
true
Process finished with exit code 0
四、总结
看完上面的测试过程,Annotation已经不再神秘了,这里总结下自定义注解的使用方法:
1、自定义注解,注意注解的时空范围,简单说就是注解针对的目标(类、方法、字段),以及注解的时效(运行时、或者源码中有效)。
2、要获取注解的信息,必须通过Java的反射技术来获取Annotation对象,因为你除此之外没有别的获取注解对象的方法。
3、获取了注解对象,就可以调用注解的方法来获取相对应的值了。为基础框架所用。
4、当然,注解也可以没有定义成员,这样注解就成了一个标记符号了。
java注解是怎么实现的
注解的使用一般是与java的反射一起使用,下面是一个例子
注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
自定义注解及其应用
1)、定义一个最简单的注解
public@interface MyAnnotation{
//......
}
2)、把注解加在某个类上:
@MyAnnotation
public class AnnotationTest{
//......
}
以下为模拟案例
自定义注解@MyAnnotation
1 package com.ljq.test;
2
3 import java.lang.annotation.ElementType;
4 import java.lang.annotation.Retention;
5 import java.lang.annotation.RetentionPolicy;
6 import java.lang.annotation.Target;
7
8/**
9*定义一个注解
10*
11*
12*@author jiqinlin
13*
14*/
15//Java中提供了四种元注解,专门负责注解其他的注解,分别如下
16
17//@Retention元注解,表示需要在什么级别保存该注释信息(生命周期)。可选的RetentionPoicy参数包括:
18//RetentionPolicy.SOURCE:停留在java源文件,编译器被丢掉
19//RetentionPolicy.CLASS:停留在class文件中,但会被VM丢弃(默认)
20//RetentionPolicy.RUNTIME:内存中的字节码,VM将在运行时也保留注解,因此可以通过反射机制读取注解的信息
21
22//@Target元注解,默认值为任何元素,表示该注解用于什么地方。可用的ElementType参数包括
23//ElementType.CONSTRUCTOR:构造器声明
24//ElementType.FIELD:成员变量、对象、属性(包括enum实例)
25//ElementType.LOCAL_VARIABLE:局部变量声明
26//ElementType.METHOD:方法声明
27//ElementType.PACKAGE:包声明
28//ElementType.PARAMETER:参数声明
29//ElementType.TYPE:类、接口(包括注解类型)或enum声明
30
31//@Documented将注解包含在JavaDoc中
32
33//@Inheried允许子类继承父类中的注解
34
35
36@Retention(RetentionPolicy.RUNTIME)
37@Target({ElementType.METHOD, ElementType.TYPE})
38 public@interface MyAnnotation{
39//为注解添加属性
40 String color();
41 String value() default"我是林计钦";//为属性提供默认值
42 int[] array() default{1, 2, 3};
43 Gender gender() default Gender.MAN;//添加一个枚举
44 MetaAnnotation metaAnnotation() default@MetaAnnotation(birthday="我的出身日期为1988-2-18");
45//添加枚举属性
46
47}
注解测试类AnnotationTest
1 package com.ljq.test;
2
3/**
4*注解测试类
5*
6*
7*@author jiqinlin
8*
9*/
10//调用注解并赋值
11@MyAnnotation(metaAnnotation=@MetaAnnotation(birthday="我的出身日期为1988-2-18"),color="red", array={23, 26})
12 public class AnnotationTest{
13
14 public static void main(String[] args){
15//检查类AnnotationTest是否含有@MyAnnotation注解
16 if(AnnotationTest.class.isAnnotationPresent(MyAnnotation.class)){
17//若存在就获取注解
18 MyAnnotation annotation=(MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);
19 System.out.println(annotation);
20//获取注解属性
21 System.out.println(annotation.color());
22 System.out.println(annotation.value());
23//数组
24 int[] arrs=annotation.array();
25 for(int arr:arrs){
26 System.out.println(arr);
27}
28//枚举
29 Gender gender=annotation.gender();
30 System.out.println("性别为:"+gender);
31//获取注解属性
32 MetaAnnotation meta=annotation.metaAnnotation();
33 System.out.println(meta.birthday());
34}
35}
36}
枚举类Gender,模拟注解中添加枚举属性
1 package com.ljq.test;
2/**
3*枚举,模拟注解中添加枚举属性
4*
5*@author jiqinlin
6*
7*/
8 public enum Gender{
9 MAN{
10 public String getName(){return"男";}
11},
12 WOMEN{
13 public String getName(){return"女";}
14};//记得有“;”
15 public abstract String getName();
16}
注解类MetaAnnotation,模拟注解中添加注解属性
1 package com.ljq.test;
2
3/**
4*定义一个注解,模拟注解中添加注解属性
5*
6*@author jiqinlin
7*
8*/
9 public@interface MetaAnnotation{
10 String birthday();
11}
java中的@是什么
Java
是Sun公司推出的一种新的编程语言。
这一新一代的程序设计语言在1995年
5
月推出后,
立即风行
Internet世界,成为一种
Internet上的世界语。
Java
是一种解释执行的语言,语法规则和
C++类似,能够用来开发在不同类型的计算机、电子设备和操作系统上运行的软件,时至今日,
Java
能轻易完成的"跨平台"对许多编程语言来说,依然难以做到,所谓的"一次编写,到处运行"就是对其技术特性最直接的描述。也即是说,
Java
可以在任何一种操作系统下工作,不管是Windows
9x、WindowsNT,还是SunSolaris、Linux、MacOS以及其他的平台,都可以使用相同的程序代码。用
Java
语言编写的程序叫做“Applet”(小应用程序),用编译器将它编译成类文件后,将它存在
WWW页面中,并在
HTML
文档上作好相应标记,用户端只要装上
Java
的客户软件就可以在网上直接运行“Applet”。
Java
采用了一种高级多线程技术来实现并发及实时的响应,这是先进的多媒体应用所必需的。
Java
非常适合于企业网络和Internet环境,现在已成为Internet世界中最受欢迎、最有影响的编程语言。
Java
有许多值得称道的优点,如简单、面向对象、分布式、解释性、可靠、安全、结构中立性、可移植性、高性能、多线程、动态性等。
Java
摈弃了C++中各种弊大于利的功能和许多很少用到的功能。
Java
可以运行与任何微处理器,用
Java
开发的程序可以在网络上传输,并运行于任何客户机上。现状Sun获利未饱和,但Sun公司也不否认,目前从
Java
这一开放的技术平台上,Sun还没有获得太多的利润。例如国内众多手机制造商只推出了6款
Java
手机,应用
Java
的力度远远不够。
据了解,Sun与联通结盟后,TCL已成为新的Ja-va特许制造商,负责为这一联盟提供新的
Java
手机。
而北京振戎融通通信技术有限公司也表示,他们已与Sun达成意向,由振戎融通公司出资,为向中国联通CDMA1x网提供手机的国内厂商集中采购
Java
-JTW1许可证。
报告显示,未来市场上无线
Java
手机的数量预计每年将翻一番,到2006年将从2001年的1910万部增长到5.53亿部。到2006年,无线
Java
手机预计将占全球手机出货量的83%
文章分享结束,什么是注解 java和java注解是怎么实现的的答案你都知道了吗?欢迎再次光临本站哦!