`
myCsdn_taoge
  • 浏览: 40556 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
文章分类
社区版块
存档分类
最新评论

Java基础加强总结(一)——注解(Annotation)

阅读更多

一、认识注解

  注解(Annotation)很重要,未来的开发模式都是基于注解的,JPA是基于注解的,Spring2.5以上都是基于注解的,Hibernate3.x以后也是基于注解的,现在的Struts2有一部分也是基于注解的了,注解是一种趋势,现在已经有不少的人开始用注解了,注解是JDK1.5之后才有的新特性

JDK1.5之后内部提供的三个注解

       @Deprecated 意思是“废弃的,过时的

       @Override 意思是“重写、覆盖

       @SuppressWarnings 意思是“压缩警告

范例:注解的应用:

复制代码
 1 package cn.gacl.annotation;
 2 /**
 3  * 此类是用来演示注解(Annotation)的应用的,注解也是JDK1.5新增加的特性之一
 4  * JDK1.5内部提供的三种注解是:@SuppressWarnings(":deprecation")、@Deprecated、@Override
 5  * @author 孤傲苍狼
 6  *
 7  */
 8 /**
 9  * 类名的命名是有讲究的,类名、属性名、变量名一般是名词,或者是形容词+名词,方法一般是动词,或者是动词+名词,
10  * 以AnnotationTest作为类名和以TestAnnotation作为类名是有区别的,
11  * 前者是注解的测试,符合名词的特征,后者是测试注解,听起来就是一个动作名称,是方法的命名特征
12  */
13 public class AnnotationTest {
14     /**
15      * @param args
16      */
17     @SuppressWarnings(":deprecation")
18     //这里就是注解,称为压缩警告,这是JDK内部自带的一个注解,一个注解就是一个类,在这里使用了这个注解就是创建了SuppressWarnings类的一个实例对象
19     public static void main(String[] args) {
20         System.runFinalizersOnExit(true);
21         //The method runFinalizersOnExit(boolean) from the type System is deprecated(过时的,废弃的)
22         //这里的runFinalizersOnExit()方法画了一条横线表示此方法已经过时了,不建议使用了
23     }
24     @Deprecated //这也是JDK内部自带的一个注解,意思就是说这个方法已经废弃了,不建议使用了
25     public static void sayHello(){
26         System.out.println("hi,孤傲苍狼");
27     }
28     @Override //这也是JDK1.5之后内部提供的一个注解,意思就是要重写(覆盖)JDK内部的toString()方法
29     public String toString(){
30         return "孤傲苍狼";
31     }
32 }
复制代码

  总结:注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序打上某种标记,没有加,则等于没有任何标记,以后,javac编译器、开发工具和其他程序可以通过反射来了解你的类及各种元素上有无何种标记,看你的程序有什么标记,就去干相应的事,标记可以加在包、类,属性、方法,方法的参数以及局部变量上。

  注解就相当于一个你的源程序要调用一个类,在源程序中应用某个注解,得事先准备好这个注解类。就像你要调用某个类,得事先开发好这个类。

二、自定义注解及其应用

  自定义一个最简单的注解:

1 public @interface MyAnnotation{}
复制代码
 1 package cn.gacl.annotation;
 2 import java.lang.annotation.ElementType;
 3 import java.lang.annotation.Retention;
 4 import java.lang.annotation.RetentionPolicy;
 5 import java.lang.annotation.Target;
 6 /**
 7  * 这是一个自定义的注解(Annotation)类 在定义注解(Annotation)类时使用了另一个注解类Retention
 8  * 在注解类上使用另一个注解类,那么被使用的注解类就称为元注解
 9  * 
10  * @author 孤傲苍狼
11  * 
12  */
13 @Retention(RetentionPolicy.RUNTIME)
14 //Retention注解决定MyAnnotation注解的生命周期
15 @Target( { ElementType.METHOD, ElementType.TYPE })
16 //Target注解决定MyAnnotation注解可以加在哪些成分上,如加在类身上,或者属性身上,或者方法身上等成分
17 /*
18  * @Retention(RetentionPolicy.SOURCE)
19  * 这个注解的意思是让MyAnnotation注解只在java源文件中存在,编译成.class文件后注解就不存在了
20  * @Retention(RetentionPolicy.CLASS)
21  * 这个注解的意思是让MyAnnotation注解在java源文件(.java文件)中存在,编译成.class文件后注解也还存在,
22  * 被MyAnnotation注解类标识的类被类加载器加载到内存中后MyAnnotation注解就不存在了
23  */
24 /*
25  * 这里是在注解类MyAnnotation上使用另一个注解类,这里的Retention称为元注解。
26  * Retention注解括号中的"RetentionPolicy.RUNTIME"意思是让MyAnnotation这个注解的生命周期一直程序运行时都存在
27  */
28 public @interface MyAnnotation {
29 }
复制代码

  把自定义的注解加到某个类上:

1 @ MyAnnotation 
2 public class AnnotationUse{
3 
4 }

  用反射测试进行测试AnnotationUse的定义上是否有@MyAnnotation

复制代码
 1 package cn.gacl.annotation;
 2 @MyAnnotation
 3 //这里是将新创建好的注解类MyAnnotation标记到AnnotaionTest类上
 4 public class AnnotationUse {
 5     public static void main(String[] args) {
 6         // 这里是检查Annotation类是否有注解,这里需要使用反射才能完成对Annotation类的检查
 7         if (AnnotationUse.class.isAnnotationPresent(MyAnnotation.class)) {
 8             /*
 9              * MyAnnotation是一个类,这个类的实例对象annotation是通过反射得到的,这个实例对象是如何创建的呢?
10              * 一旦在某个类上使用了@MyAnnotation,那么这个MyAnnotation类的实例对象annotation就会被创建出来了
11              * 假设很多人考驾照,教练在有些学员身上贴一些绿牌子、黄牌子,贴绿牌子的表示送礼送得比较多的,
12              * 贴黄牌子的学员表示送礼送得比较少的,不贴牌子的学员表示没有送过礼的,通过这个牌子就可以标识出不同的学员
13              * 教官在考核时一看,哦,这个学员是有牌子的,是送过礼给他的,优先让有牌子的学员过,此时这个牌子就是一个注解
14              * 一个牌子就是一个注解的实例对象,实实在在存在的牌子就是一个实实在在的注解对象,把牌子拿下来(去掉注解)注解对象就不存在了
15              */
16             MyAnnotation annotation = (MyAnnotation) AnnotationUse.class
17                     .getAnnotation(MyAnnotation.class);
18             System.out.println(annotation);// 打印MyAnnotation对象,这里输出的结果为:@cn.itcast.day2.MyAnnotation()
19         }
20     }
21 }
复制代码

 三、@Retention元注解

  根据反射的测试的问题,引出@Retention元注解的讲解:其三种取值:RetentionPolicy.SOURCERetentionPolicy.CLASSRetentionPolicy.RUNTIME分别对应:Java源文件(.java文件)---->.class文件---->内存中的字节码

 四、 Retention注解说明

    当在Java源程序上加了一个注解,这个Java源程序要由javac去编译,javac把java源文件编译成.class文件,在编译成class时可能会把Java源程序上的一些注解给去掉,java编译器(javac)在处理java源程序时,可能会认为这个注解没有用了,于是就把这个注解去掉了,那么此时在编译好的class中就找不到注解了, 这是编译器编译java源程序时对注解进行处理的第一种可能情况,假设java编译器在把java源程序编译成class时,没有把java源程序中的注解去掉,那么此时在编译好的class中就可以找到注解,当程序使用编译好的class文件时,需要用类加载器把class文件加载到内存中,class文件中的东西不是字节码,class文件里面的东西由类加载器加载到内存中去,类加载器在加载class文件时,会对class文件里面的东西进行处理,如安全检查,处理完以后得到的最终在内存中的二进制的东西才是字节码,类加载器在把class文件加载到内存中时也有转换,转换时是否把class文件中的注解保留下来,这也有说法,所以说一个注解的生命周期有三个阶段:java源文件是一个阶段,class文件是一个阶段,内存中的字节码是一个阶段,javac把java源文件编译成.class文件时,有可能去掉里面的注解,类加载器把.class文件加载到内存时也有可能去掉里面的注解,因此在自定义注解时就可以使用Retention注解指明自定义注解的生命周期,自定义注解的生命周期是在RetentionPolicy.SOURCE阶段(java源文件阶段),还是在RetentionPolicy.CLASS阶段(class文件阶段),或者是在RetentionPolicy.RUNTIME阶段(内存中的字节码运行时阶段),根据JDK提供的API可以知道默认是在RetentionPolicy.CLASS阶段 (JDK的API写到:the retention policy defaults to RetentionPolicy.CLASS.)

  下面看看@Deprecated、@Override、@SuppressWarnings这三个注解的@Retention注解的属性值分别是什么吧

4.1、@Deprecated

  Java API中是这样定义的@Deprecated的

1 @Documented
2 @Retention(value=RUNTIME)
3 public @interface Deprecated

4.2、@Override

  Java API中是这样定义的@Override的

1 @Target(value=METHOD)
2 @Retention(value=SOURCE)
3 public @interface Override

  @Override是给javac(java编译器)看的,编译完以后就@Override注解就没有价值了,@Override注解在源代码中有用,编译成.class文件后@Override注解就没有用了,因此@Override的Retention的属性值是RetentionPolicy.SOURCE

4.3、@SuppressWarnings

  Java API中是这样定义的@SuppressWarnings的

1 @Target(value={TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})
2 @Retention(value=SOURCE)
3 public @interface SuppressWarnings

  @SuppressWarnings是给javac(java编译器)看的,编译器编译完java文件后,@SuppressWarnings注解就没有用了,所以@SuppressWarnings的Retention的属性值是RetentionPolicy.SOURCE

五、@Target元注解

  @Target元注解决定了一个注解可以标识到哪些成分上,如标识在在类身上,或者属性身上,或者方法身上等成分,@Target默认值为任何元素(成分)

例如:

1 @Target(value={TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})
2 @Retention(value=SOURCE)
3 public @interface SuppressWarnings

六、为注解增加属性

  注解可以看成是一种特殊的类,既然是类,那自然可以为类添加属性

6.1.添加属性

 语法:类型 属性名();

复制代码
 1 package cn.gacl.annotation;
 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 @Retention(RetentionPolicy.RUNTIME)
 9 //Retention注解决定MyAnnotation注解的生命周期
10 @Target( { ElementType.METHOD, ElementType.TYPE })
11 public @interface MyAnnotation {
12     /**
13      * 定义基本属性
14      * @return
15      */
16     String color();
17 }
复制代码

  其实从代码的写法上来看,注解更像是一种特殊的接口,注解的属性定义方式就和接口中定义方法的方式一样,而应用了注解的类可以认为是实现了这个特殊的接口

6.2.应用属性

复制代码
 1 package cn.gacl.annotation;
 2 
 3 @MyAnnotation(color="red")//应用MyAnnotation注解的color属性
 4 public class MyAnnotationTest {
 5     public static void main(String[] args) {
 6         /**
 7          * 用反射方式获得注解对应的实例对象后,在通过该对象调用属性对应的方法
 8          */
 9         MyAnnotation annotation = (MyAnnotation) MyAnnotationTest.class.getAnnotation(MyAnnotation.class);
10         System.out.println(annotation.color());//输出red
11     }
12 }
复制代码

6.3.为属性指定缺省值(默认值)

  语法:类型 属性名() default 默认值;

复制代码
package cn.gacl.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
//Retention注解决定MyAnnotation注解的生命周期
@Target( { ElementType.METHOD, ElementType.TYPE })
public @interface MyAnnotation {
    String color() default "blue";//为属性指定缺省值
}
复制代码
复制代码
 1 package cn.gacl.annotation;
 2 
 3 @MyAnnotation
 4 public class MyAnnotationTest {
 5     public static void main(String[] args) {
 6         /**
 7          * 用反射方式获得注解对应的实例对象后,在通过该对象调用属性对应的方法
 8          */
 9         MyAnnotation annotation = (MyAnnotation) MyAnnotationTest.class.getAnnotation(MyAnnotation.class);
10         System.out.println(annotation.color());//输出color属性的默认值:blue
11         
12     }
13 }
复制代码

6.4.value属性

  如果一个注解中有一个名称为value的属性,且你只想设置value属性(即其他属性都采用默认值或者你只有一个value属性),那么可以省略掉“value=”部分。

  例如:@SuppressWarnings("deprecation")

复制代码
 1 package cn.gacl.annotation;
 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 @Retention(RetentionPolicy.RUNTIME)
 9 //Retention注解决定MyAnnotation注解的生命周期
10 @Target( { ElementType.METHOD, ElementType.TYPE })
11 public @interface MyAnnotation {
12     String color() default "blue";//为属性指定缺省值
13     String value();//定义一个名称为value的属性
14 }
复制代码
复制代码
 1 package cn.gacl.annotation;
 2 
 3 @MyAnnotation("孤傲苍狼")//等价于@MyAnnotation(value="孤傲苍狼")
 4 public class MyAnnotationTest {
 5     public static void main(String[] args) {
 6         /**
 7          * 用反射方式获得注解对应的实例对象后,在通过该对象调用属性对应的方法
 8          */
 9         MyAnnotation annotation = (MyAnnotation) MyAnnotationTest.class.getAnnotation(MyAnnotation.class);
10         System.out.println(annotation.color());//输出color属性的默认值:blue
11         System.out.println(annotation.value());
12         
13     }
14 }
复制代码

七、为注解增加高级属性

7.1、数组类型的属性

  • 增加数组类型的属性:int[] arrayAttr() default {1,2,4};
  • 应用数组类型的属性:@MyAnnotation(arrayAttr={2,4,5})
  • 如果数组属性只有一个值,这时候属性值部分可以省略大括号,如:@MyAnnotation(arrayAttr=2),这就表示数组属性只有一个值,值为2

7.2.、枚举类型的属性

  • 增加枚举类型的属性:EumTrafficLamp lamp() default EumTrafficLamp.RED;
  • 应用枚举类型的属性:@MyAnnotation(lamp=EumTrafficLamp.GREEN)

7.3、注解类型的属性

复制代码
1 /**
2  * MetaAnnotation注解类为元注解
3  * @author 孤傲苍狼
4  *
5  */
6 public @interface MetaAnnotation {
7     String value();//元注解MetaAnnotation设置有一个唯一的属性value
8 }
复制代码

  为注解添加一个注解类型的属性,并指定注解属性的缺省值:MetaAnnotation annotationAttr() default @MetaAnnotation("xdp");

八、注解综合测试

EumTrafficLamp.java

复制代码
 1 package cn.gacl.annotation;
 2 /**
 3  * 交通信号灯颜色枚举
 4  * @author 孤傲苍狼
 5  *
 6  */
 7 public enum EumTrafficLamp {
 8     RED,//
 9     YELLOW,//
10     GREEN//绿
11 }
复制代码

MetaAnnotation.java

复制代码
1 /**
2  * MetaAnnotation注解类为元注解
3  * @author 孤傲苍狼
4  *
5  */
6 public @interface MetaAnnotation {
7     String value();//元注解MetaAnnotation设置有一个唯一的属性value
8 }
复制代码

MyAnnotation.java

复制代码
 1 package cn.gacl.annotation;
 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 @Retention(RetentionPolicy.RUNTIME)
 9 //Retention注解决定MyAnnotation注解的生命周期
10 @Target({ElementType.METHOD, ElementType.TYPE})
11 public @interface MyAnnotation {
12     String color() default "blue";//为属性指定缺省值
13     /**
14      * 为注解添加value属性,这个value属性很特殊,如果一个注解中只有一个value属性要设置,
15      * 那么在设置注解的属性值时,可以省略属性名和等号不写, 直接写属性值,如@SuppressWarnings("deprecation"),
16      * 这里的MyAnnotation注解设置了两个String类型的属性,color和value,
17      * 因为color属性指定有缺省值,value属性又是属于特殊的属性,因此使用MyAnnotation注解时
18      * 可以这样使用MyAnnotation注解:"@MyAnnotation(color="red",value="xdp")"
19      * 也可以这样使用:"@MyAnnotation("孤傲苍狼")",这样写就表示MyAnnotation注解只有一个value属性要设置,color属性采用缺省值
20      * 当一个注解只有一个value属性要设置时,是可以省略"value="的
21      */
22     String value();//定义一个名称为value的属性
23     //添加一个int类型数组的属性
24     int[] arrayAttr() default {1,2,4};
25     //添加一个枚举类型的属性,并指定枚举属性的缺省值,缺省值只能从枚举类EumTrafficLamp中定义的枚举对象中取出任意一个作为缺省值
26     EumTrafficLamp lamp() default EumTrafficLamp.RED;
27     //为注解添加一个注解类型的属性,并指定注解属性的缺省值
28     MetaAnnotation annotationAttr() default @MetaAnnotation("xdp");
29 
30 }
复制代码

MyAnnotationTest.java

复制代码
 1 package cn.gacl.annotation;
 2 /**
 3  * 这里是将新创建好的注解类MyAnnotation标记到AnnotaionTest类上,
 4  * 并应用了注解类MyAnnotation中定义各种不同类型的的属性
 5  */
 6 @MyAnnotation(
 7         color="red",
 8         value="孤傲苍狼",
 9         arrayAttr={3,5,6},
10         lamp=EumTrafficLamp.GREEN,
11         annotationAttr=@MetaAnnotation("gacl")
12         )
13 public class MyAnnotationTest {
14     @MyAnnotation("将MyAnnotation注解标注到main方法上")
15     public static void main(String[] args) {
16         /**
17          * 这里是检查Annotation类是否有注解,这里需要使用反射才能完成对Annotation类的检查
18          */
19         if(MyAnnotationTest.class.isAnnotationPresent(MyAnnotation.class)) {
20             /**
21              * 用反射方式获得注解对应的实例对象后,在通过该对象调用属性对应的方法
22              * MyAnnotation是一个类,这个类的实例对象annotation是通过反射得到的,这个实例对象是如何创建的呢?
23              * 一旦在某个类上使用了@MyAnnotation,那么这个MyAnnotation类的实例对象annotation就会被创建出来了
24              */
25             MyAnnotation annotation = (MyAnnotation) MyAnnotationTest.class.getAnnotation(MyAnnotation.class);
26             System.out.println(annotation.color());//输出color属性的默认值:red
27             System.out.println(annotation.value());//输出value属性的默认值:孤傲苍狼
28             System.out.println(annotation.arrayAttr().length);//这里输出的数组属性的长度的结果为:3,数组属性有三个元素,因此数组的长度为3
29             System.out.println(annotation.lamp());//这里输出的枚举属性值为:GREEN
30             System.out.println(annotation.annotationAttr().value());//这里输出的注解属性值:gacl
31             
32             MetaAnnotation ma = annotation.annotationAttr();//annotation是MyAnnotation类的一个实例对象
33             System.out.println(ma.value());//输出的结果为:gacl
34 
35             
36         }
37     }
38 }

转自:http://www.cnblogs.com/xdp-gacl/p/3622275.html
分享到:
评论

相关推荐

    MLDN学习笔记 —— Annotation

    《MLDN学习笔记——Annotation》这篇博文主要探讨的是在编程领域中,特别是Java语言中,关于Annotation(注解)的深入理解和应用。Annotation是Java语言提供的一种元数据,它为程序提供了额外的信息,这些信息可以被...

    java5.0新特性总结--Annotation系统学习整理笔记

    总结来说,Java 5.0的注解特性极大地增强了代码的可读性和可维护性,减少了XML配置,简化了框架的使用。通过学习和理解注解,开发者能够更高效地利用Java生态系统中的各种工具和框架,提升开发效率和代码质量。在...

    Java语言基础入门教程 Java实训教程 12.注解 共35页.pptx

    ### Java语言基础入门教程——注解 #### 一、引言与目标 本文档旨在介绍Java语言中的注解(Annotation)及其使用方法。通过本章节的学习,读者将能够理解注解的基本概念,学会如何定义注解,并掌握如何在实际开发...

    Android进阶——Java注解实战之APT构建模块化的第一步

    总结来说,Java注解和APT是Android模块化开发中强大的工具。它们允许我们以声明式的方式描述代码的特性,然后在编译时自动生成必要的辅助代码,从而实现更高效、更灵活的代码组织。通过熟练掌握这些技术,开发者可以...

    struts2利用注解annotation实现文件下载

    Struts2是一个基于MVC架构的Java Web应用框架,它继承了Struts1的优点,并在此基础上进行了改进。Struts2框架的核心是拦截器机制,这使得开发者能够更加灵活地处理请求和响应。Struts2还集成了Spring和Hibernate等...

    java1.5 annotation注释源代码

    Java 1.5 引入了一种新的元编程机制——注解(Annotation),极大地增强了代码的可读性和可维护性。注解是一种在代码中添加元数据的方式,它允许程序员在源代码上添加一些信息,这些信息可以被编译器或运行时环境...

    java反射机制 字符串——java对象

    然而,如果需要将对象转换为XML格式,可以使用`javax.xml.bind.annotation.XmlRootElement`注解标记类,并利用Java的JAXB(Java Architecture for XML Binding)框架将对象转换为XML字符串。 另一方面,将字符串...

    4Spring自动装配——annotation resource方式

    然而,`@Resource`注解则提供了另一种自动装配方式,尤其是在处理Java EE规范中的资源时,如JNDI查找。 ### 二、`@Resource`注解 `@Resource`注解源于JSR-250规范,Spring也对其进行了支持。与`@Autowired`不同,`...

    基于注解形式的Java操作excel表格

    Java库如Apache POI和JExcelAPI提供了对Excel的支持,但这里我们主要关注使用注解的库——例如,`OpenPojoExcel`或`XLSheet Annotation Processor`。这些库允许开发者通过在类和方法上添加特定注解,来定义Excel工作...

    Java JDK 6学习笔记——ppt简体版 第17章.ppt

    在Java编程语言中,注解(Annotation)是一种元数据,它提供了将信息附加到代码中的方式,这些信息可以被编译器、IDE或运行时环境用来进行各种处理。Java JDK 6引入了对注解的广泛支持,极大地增强了代码的可维护性...

    hibernate注解annotation的jar

    总的来说,这三个jar包是Hibernate注解开发的基础,它们共同构建了一个强大的ORM环境,让开发者能够专注于业务逻辑,而不必过多地关心数据库层面的细节。在实际项目中,通过引入这些库,可以提高开发效率,同时保持...

    java注解、java反射机制 jdbc 封装

    总之,这个案例结合了Java的三大利器——注解、反射和JDBC,旨在创建一个高效、灵活且易于扩展的数据访问层。对于想要深入理解Java高级特性的开发者来说,这是一个极好的学习资源。通过实践和研究,你可以掌握如何...

    511.509.JAVA基础教程_枚举类与注解-jdk8新特性:类型注解(511).rar

    本教程主要聚焦于Java中的枚举类、注解以及JDK 8引入的新特性——类型注解。通过深入理解这些概念,开发者可以更好地掌握Java的高级特性,提高代码的可读性、可维护性和安全性。 首先,我们来探讨枚举类(Enum)。...

    java jdk5.0学习笔记——良葛格

    Java JDK 5.0是Java开发工具包的一个重要版本,它在2004年发布,引入了许多新特性,极大地增强了Java编程语言的功能和效率。良葛格的《Java JDK5.0学习笔记》是一本面向初学者的教程,旨在帮助读者掌握这个版本的...

    自定义Annotation注解

    本教程将通过一个简单的自定义Annotation注解示例——`CustomAnnotationDemo`,帮助新手了解如何创建和使用自定义注解。 首先,让我们看看如何定义一个自定义注解。在Java中,注解的定义使用`@interface`关键字。...

    Java基础-注解和反射

    从JDK5开始,Java引入了一个重要的特性——元数据支持,即注解。这是一项强大的功能,它允许开发者在不改变原有代码逻辑的情况下向源代码中添加额外的信息。注解在代码中表现为特殊的标记,这些标记可以在编译阶段、...

    java SSH项目 hibernate annotation

    Java SSH项目是基于三个主要框架——Struts、Spring和Hibernate构建的企业级Web应用程序。这个项目中,Hibernate作为ORM(对象关系映射)工具被用来处理数据库操作,而使用了注解方式来配置Hibernate,这是一种更加...

    java-ppt.rar_java .ppt_java ppt_java基础 ppt_java基础 ppt_ppt jav

    1. **Java环境搭建**:包括下载JDK(Java Development Kit),设置环境变量如JAVA_HOME, PATH, CLASSPATH,以及如何运行第一个Java程序——经典的"Hello, World!"。 2. **语法基础**:包括数据类型(基本类型如int,...

Global site tag (gtag.js) - Google Analytics