Java 注解简单学习

77 篇文章 12 订阅
69 篇文章 5 订阅


(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/77333860冷血之心的博客)


1、注解的概述:

 

注解是用来替代配置文件的!你回忆一下,我们以前总是要写一些配置文件,例如web.xml你还记得么?里面要写<servlet>和<servlet-mapping>!谁来读配置文件呢?当然是Tomcat!谁来写配置文件呢?当然是我们来写了!

在Servlet3.0中就可以使用使用注解来代替配置文件,开发者就不用再写配置文件了,而是写注解,然后Tomcat来读取注解。注解也是类,需要定义了才能使用!分别在Servlet3.0中有一个注解类为@WebServlet,然后我们就可以在Servlet中使用

@WebServlet中使用这个注解了。这个注解就是用来替代<servlet>了。然后Tomcat会通过反射来读取注解中的信息!


小结:

  注解的语法:@注解名称
  注解的作用:替代xml配置文件!


2、Java中的注解:

  • @Overrid:作用在方法上的注解。当方法不是重写父类的方法时会报错;
  • @Deprecated:作用在方法上。标记该方法为作废方法(已过时);
  • @SuppressWarnings:作用在方法上,压制警告

3、注解的使用:

  • 定义注解类:框架的工作
  • 使用注解:我们的工作
  • 读取注解(反射):框架的工作

4、定义注解类:


定义注解类不能使用class、enum,也不能使用interface,而是使用@interface

eg.   

public @interface MyAnn{}  


5、使用注解的目标:


注解可以使用在类(接口或枚举)、属性、方法、构造器、包、参数、局部变量

eg.

package cn.ywq;  
  
@MyAnn  
public class MyClass {  
    @MyAnn  
    private int a;  
    @MyAnn  
    public MyClass() {}  
    @MyAnn  
    public void fun1() {}  
    @MyAnn  
    public void fun2(@MyAnn String s) {  
        @MyAnn  
        int n = 10;  
    }  
}  


6、注解的属性:


定义注解时,也可以给出属性。

public @interface MyAnn {  
    String value();  
    int value1();  
}

其中value就是属性!你可能会说,它是一个方法!没错,它是一个方法,但我们非要称之为属性,因为把它当做属性更加好理解。当为注解指定属性后,那么在使用注解时就必须要给属性赋值了:

@MyAnn(value1=100,value="hello")  
public class MyClass {  
} 

注解的属性还可以有默认值,在使用注解时就可以不给带有默认值的属性赋值了。但没有给出默认值的属性还是要赋值的。

public @interface MyAnn {  
    String value() default "hello world";   
    int value1();  
}  
@MyAnn(value1=100)   
public class MyClass {  
} 


在使用注解时,如果只给名为value的属性赋值,那么可以不给出属性的名称直接给出值

public @interface MyAnn {  
    String value() default "hello world";  
    int value1() default 100;  
}  
@MyAnn()   
public class MyClass {  
}  
@MyAnn(value="hello")   
public class MyClass {  
}  
@MyAnn(value1=200)   
public class MyClass {  
}  
@MyAnn(value="hello",value1=200)   
public class MyClass {  
}  
@MyAnn("hello annocation")   
public class MyClass {  
}  
@MyAnn(300)   
public class MyClass {  
}  
@MyAnn("hello",value1=200)   
public class MyClass {  
}  

  cop

  • 注解的属性后面要有一对圆括号,而且圆括号内不能给出东西。就像是无参的方法一样;
  • 注解的属性类型只能是:基本类型、String、Enum、Class、注解类型、以上类型的一维数组类型;
  • 注解的属性可以有默认值,例如:int a() default 100;
  • 数组的属性默认值:int[] arr() default {1,2,3},这里不能使用new int[]{1,2,3}
  • 使用注解时,在给数组属性赋值时的格式:@MyAnn(arr={1,2,3});

注解属性的类型
    > 8种基本类型
    > String
    > Enum
    > Class
    > 注解类型
    > 以上类型的一维数组类型

    当给数组类型的属性赋值时,若数组元素的个数为1时,可以省略大括号。

eg

@MyAnno1(   //相当于一个注解对象  
    a=100,  
    b="hello",  
    c=MyEnum1.A,  
    d=String.class,  
    e=@MyAnno2(aa=200, bb="world"),    所以此处e也得是一个注解对象  
    f=100    //省略了大括号  
)  
public class Demo3 {  
  
}  
  
@interface MyAnno1 {  
    int a();  
    String b();  
    MyEnum1 c();  
    Class d();  
    MyAnno2 e();  
    int[] f();  
}  
@interface MyAnno2{  
       int aa();  
       String bb();  
} 
 

7、注解的作用目标:(@Target)


在定义注解时可以限制注解的作用目录!例如让注解只能作用在类和方法上。

这需要使用元注解:@Target。该注解有一个属性value,类型为ElementType[],它是枚举类型。


Target注解的源码如下:

public @interface Target {  
    ElementType[] value();  
}  
public enum ElementType {  
  TYPE,FIELD,METHOD,PARAMETED,CONSTRUCTOR,LOCAL_VARIABLE,ANNOCATION_TYPE,PACKAGE  
}  

在定义注解时,可以使用@Target注解来限制注解的作用目标:

@Target({ElementType.TYPE, ElementType.METHOD})  
public @interface MyAnn {  
}

这样MyAnn就只能作用在类和方法上的!其中ElementType.TYPE表示类和接口。

@MyAnn()  
public class MyClass {  
    @MyAnn()  //报错  
    private int a;  
      
    @MyAnn()  
    public void fun() {}  
} 

  copy


8、注解的保留策略:(@Rentention)

  • 注解的保留策略是指,注解是只保留在源代码上,还是保留到class文件上,再或者是类在运行时,可以被类加载器加载到内存中。
  • 如果希望注解被反射,那么注解就要保留到运行时,而不是源代码或类文件上。
  • 指定注解的保留策略需要使用元注解@Retention,它有一个value属性,类型为RetentionPolicy类型,RetentionPolicy是枚举类型
public @interface Retention {  
    RetentionPolicy value();  
}  
public enum RetentionPolicy {  
    SOURCE, CLASS, RUNTIME  
} 

下面代码是指定注解保留到运行时:

@Retention(RetentionPolicy.RUNTIME)  
@Target({ElementType.TYPE, ElementType.METHOD})  
public @interface MyAnn {  
    String value() default "hello";  
    int value1() default 100;  
}  

9、注解处理器

 view plain cop

前面我们介绍了如何定义一个注解,并且阐述了定义注解的属性以及注解可以使用的位置等。那么我们的注解如何才能开始工作呢?即我们的注解内部该如何处理?这个时候我们就需要定义一个注解处理器了。

注解处理器定义了该注解的处理逻辑,下边我们举例说明。


要求:定义一个注解 @Retry ,该注解的功能是每隔一定的时间执行一次该方法,一共执行指定的次数。

好的,根据题意,我们可以定义如下的注解。

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

@Target(ElementType.METHOD) // 指明该注解的作用范围是方法上
@Retention(RetentionPolicy.RUNTIME)  // 指明该注解在运行时仍保留
public @interface Retry {
	int interval() default 3; // 定义属性,并且拥有默认值
	int time() default 3000;
}
接着是我们的注解处理器:

// 注解处理器,定义注解的逻辑处理
class RetryProcessor {
	public void parseMethod(Class<?> clazz) throws Exception{
		Method[] methods = clazz.getDeclaredMethods(); // 根据.class得到 该类中的method
		for(final Method method : methods){
			Retry retry = method.getAnnotation(Retry.class); // 得到该method上的注解信息,可以为null
			if(retry != null){
				final int interval = retry.interval();  // 获得注解的属性
				final int time = retry.time();
				// 建立一个线程,并且执行method.invoke()方法
				ExecutorService executorService = Executors.newFixedThreadPool(2);
				executorService.execute(new Runnable() {
					@Override
					public void run() {
						for (int i = 0; i < interval; i++) {
							try {
								// 通过反射执行方法
								method.invoke(new Object(), "57890");
								Thread.sleep(time);
							} catch (Exception e) {
								e.printStackTrace();
							}
						}
					}
				});
			}
		}
	}
}
测试类如下:

public class RetryTest {
	/*@Retry
	public static void sayHello(){
		System.out.println("Hello World");
	}*/ 如果要使用该方法时,method.invoke(new Object(),null)即可
	@Retry
	public static void sayHello(String name){
		System.out.println("say hello1 " + name);
	}
	@Retry(interval = 2, time = 9000)
	public static void sayHello2(String name){
		System.out.println("say hello2 " + name);
	}
	public static void main(String[] args) throws Exception {
		RetryProcessor retry = new RetryProcessor();
		retry.parseMethod(RetryTest.class);
	}
}

如此,我们即定义了一个完整的注解@Retry,实现了在每隔固定的时间执行方法一次,一共执行指定的次数。


总结:

1、注解的定义使用@interface标识

2、注解可以定义属性,并且可以拥有默认值

3、注解可以作用在类(接口或枚举)、属性、方法、构造器、包、参数、局部变量

4、注解处理器定义了注解的处理逻辑,涉及到反射机制、线程机制等。



如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以进群366533258一起交流学习哦~


本群给大家提供一个学习交流的平台,内设菜鸟Java管理员一枚、精通算法的金牌讲师一枚、Android管理员一枚、蓝牙BlueTooth管理员一枚、Web前端管理一枚以及C#管理一枚。欢迎大家进来交流技术。




  • 8
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems公司于1995年5月正式发布。它的设计目标是“一次编写,到处运行(Write Once, Run Anywhere)”,这意味着开发者可以使用Java编写应用程序,并在支持Java的任何平台上无需重新编译即可运行,这得益于其独特的跨平台性,通过Java虚拟机(JVM)实现不同操作系统上的兼容。 Java的特点包括: 面向对象:Java全面支持面向对象的特性,如封装、继承和多态,使得代码更易于维护和扩展。 安全:Java提供了丰富的安全特性,如禁止指针运算、自动内存管理和异常处理机制,以减少程序错误和恶意攻击的可能性。 可移植性:Java字节码可以在所有安装了JVM的设备上执行,从服务器到嵌入式系统,再到移动设备和桌面应用。 健壮性与高性能:Java通过垃圾回收机制确保内存的有效管理,同时也能通过JIT编译器优化来提升运行时性能。 标准库丰富:Java拥有庞大的类库,如Java SE(Java Standard Edition)包含基础API,用于开发通用应用程序;Java EE(Java Enterprise Edition)提供企业级服务,如Web服务、EJB等;而Java ME(Java Micro Edition)则针对小型设备和嵌入式系统。 社区活跃:Java有着全球范围内庞大的开发者社区和开源项目,持续推动技术进步和创新。 多线程支持:Java内建对多线程编程的支持,使并发编程变得更加简单直接。 动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的角色,是现代软件开发不可或缺的重要工具之一。
Java SSM(Spring+SpringMVC+MyBatis)是一种基于Java语言的Web开发框架。学习这个框架的过程中,我深刻体会到它的强大和灵活性。 首先,Spring框架为开发者提供了一个强大的IOC(Inversion of Control)容器,它能够管理和注入对象,减少了代码之间的耦合性。通过配置文件或注解,我们可以轻松地定义和获取各种对象,提高了代码的可维护性和可扩展性。 其次,SpringMVC框架是一种MVC(Model-View-Controller)设计模式的实现,它用于处理Web请求和响应。通过配置一个请求映射表和处理器,我们可以将请求分发给相应的控制器进行处理,并将处理结果返回给客户端。SpringMVC还提供了一些便捷的注解和标签,用于简化页面的渲染和参数的绑定。 最后,MyBatis是一种优秀的持久化框架,它能够将数据库操作与Java对象之间的映射简化为简单的配置。通过编写SQL映射文件和定义POJO(Plain Old Java Object)类,我们可以方便地进行数据库的增删改查操作,而无需编写冗长的SQL语句。 在学习Java SSM框架的过程中,我深入理解了软件开发过程中的MVC思想,并学会了如何利用Spring、SpringMVC和MyBatis来实现一个完整的Web应用程序。通过不断的实践和调试,我逐渐培养了自己解决问题和调试代码的能力。 总结起来,学习Java SSM框架使我深入理解了软件开发的各个环节,并提升了我的编码能力和开发效率。我相信这些知识和经验将对我的职业发展和项目实施起到积极的促进作用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温柔狠角色

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值