1、注解能做什么?
源码:在源代码上做注释,生成文档注释
编译:编译时候检查代码错误和警告
JVM:可以利用Annotations生成代码,XML文件等
2、注解的使用
@注解名称(属性名=属性值,属性名={属性值1,属性值2,.......},.........)
在一个类元素上可以放置多个注解,每个注解占用一行
可以重复使用同一个注解
package java注解;
import java.util.ArrayList;
import java.util.List;
public class AnnotationTest extends java.lang.Object{
@Override //覆盖,重写【错误检查】
@SuppressWarnings({ "unused", "rawtypes" }) //压制警告
public String toString() {
// TODO 自动生成的方法存根
List list=new ArrayList();
String name="king";
//System.out.print(name);
String age="15";
return super.toString();
}
public static void main(String[] args) {
}
}
使用eclipse的小技巧(快捷键):
.Alt+? 方法补全
Ctrl+Shift+O 导入需要的jre 包
F11 保存好后可直接运行
3、预定义注解
@Deprecated //未来可能会舍弃的变量、方法、函数等
package 预定义注解;
public class TestDeprecated {
public static void main(String[] args) {
Caculator caculator=new Caculator();
double result=caculator.caculate(5);
System.out.print(result);
}
}
class Caculator{
@Deprecated //未来可能会舍弃变量PI
public final static double PI=3.1415926;
@Deprecated //未来可能会舍弃方法caculate
public double caculate(double radius) {
return PI*radius*radius;
}
}
@Override 子类继承父类时,方法的覆盖、重写检查
package 预定义注解;
public class TestOverride extends java.lang.Object{
@Override //方法的重写 检查
public String toString() {
// TODO 自动生成的方法存根
return super.toString();
}
public static void main(String[] args) {
}
}
class Bycle{
int speed;
void speedUp() {
speed++;
}
}
class MountainBycle extends Bycle{
@Override
void speedUp() { //方法的重写 检查
this.speed=(speed++)*2;
}
}
@SuppressWarnings :压制警告信息,变量名(value,可省略)
package 预定义注解;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class TestSuppressWarnings {
@SuppressWarnings({ "deprecation", "unused", "rawtypes", "unchecked"}) //压制警告
public static void main(String[] args) {
Date now =new Date();
int year=now.getYear();
// 方法一: List<String> list=new ArrayList<String>();
List list =new ArrayList<>();
list.add("king"); //类型安全:方法 add(Object)属于原始类型 List。应该将对通用类型 List<E> 的引用参数化
// 方法二: @SuppressWarnings( "unchecked")
}
}
@SafeVarargs 注释可变长参数,压制警告
//方法重载来实现
public static void printPameter(int a) {
System.out.println(a);
}
public static void printPameter(int a,int b)
{
System.out.println(a);
System.out.println(b);
}
//可变长参数来实现
public static void printPameter(int...a) { //使用 (数据类型...变量名)
for(int i:a) {
// 这种有冒号的for循环叫做foreach循环,foreach语句是java5的新特征之一,在遍历数组、集合方面,foreach为开发人员提供了极大的方便。
// foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句,然而,任何的foreach语句都可以改写为for语句版本。
// foreach并不是一个关键字,习惯上将这种特殊的for语句格式称之为“foreach”语句。从英文字面意思理解foreach也就是“for 每一个”的意思。实际上也就是这个意思。
// foreach的语句格式: for(元素类型t 元素变量x : 遍历对象obj){ 引用了x的java语句; }
System.out.println(i);
}
}
//使用泛型T,来实现可变长参数化
@SafeVarargs //去掉参数a上的警告
public static <T> void printPameter(T...a) { //内部使用泛型时,在返回值上加上 <T>
for(T i:a) {
System.out.println(i);
}
}
@FunctionalInterface ;压制"非功能接口"
//使用 实现接口 来完成
package 预定义注解;
public class TestFunctionalInterface {
private Greet greet;
public TestFunctionalInterface(Greet greet) {
this.greet=greet;
}
public static void main(String[] args) {
Greet greet=new MyGreet();
TestFunctionalInterface test=new TestFunctionalInterface(greet);
test.greet.greeting("shaohang");
}
}
interface Greet{
public void greeting(String name);
}
class MyGreet implements Greet{
@Override
public void greeting(String name) {
// TODO 自动生成的方法存根
System.out.println("早上好:"+name);
}
}
//使用 匿名内部类 实现
package 预定义注解;
public class TestFunctionalInterface {
private Greet greet;
public TestFunctionalInterface(Greet greet) {
this.greet=greet;
}
public static void main(String[] args) {
TestFunctionalInterface test=new TestFunctionalInterface(new Greet() {
@Override
public void greeting(String name) {
// TODO 自动生成的方法存根
System.out.println("早上好:"+name);
}
});
test.greet.greeting("shaohang");
}
}
interface Greet{
public void greeting(String name);
}
//当接口有多个方法时,使用 @FunctionalInterface 解决
package 预定义注解;
public class TestFunctionalInterface {
private Greet greet;
public TestFunctionalInterface(Greet greet) {
this.greet=greet;
}
public static void main(String[] args) {
TestFunctionalInterface test=new TestFunctionalInterface((String name)->System.out.println("早上好:"+name));
test.greet.greeting("tom");
}
}
//功能接口:只能有一个方法的接口,若出现两个以上的方法,用 @FunctionalInterface 压制
@FunctionalInterface
interface Greet{
public void greeting(String name);
public void greetings(String name);
}
4、自定义注解:
语法格式:
public | default @interface 注解名称 {
属性类型 属性名() default 默认值;
}
例子:
//自定义注解,起到注释作用
package 自定义注解;
public @interface MyAnnotation {
String author();
String date();
String lastModified() default "N/A";
String lastModifiedBy() default "N/A";
String[] revievers();
String value();
}
5、元注解: 定义注解的注解(约束和显示其他注解的注解)
反射读取注解:得到Class类中的class实例,就相当于得到了class文件,——.>就可以得到A.class中所有的内容(包括私有属性,方法,构造器,父类,子类,实现的接口,以及定义的注解等)