注解就是源代码的元数据,通熟的讲就是代码中的标签。
java中注解主要用于标记代码,或结合其他方法,如反射,实现值的传递。另外,注解在框架中也使用较多。
java中有7种自带的注解,包括@Override, @Deprecated, @SuppressWornings 和四种元注解(表示注解的注解)。jdk7后,逐步增加为10种。
(1)按来源分
JDK 自带注解;
第三方注解,如Spring框架中的RequestMapping注解等;
自定义注解,使用 @interface 关键字定义。
(2)按生命周期划分
SOURCE:只存在于源代码中,编译成 class 文件就不存在了。
Class:存在于源代码中和 class 文件中。
RUNTIME:注解保留到运行时。
(1)三种基本注解
(2)四种元注解
(3)新增注解
从 Java 7 开始,额外添加了 3 个注解:
在java自带的注解中,我在练习中使用到最多的是@Override和@Retention。
自定义注解的关键字为@interface,且修饰符必须为public而不能为其它,不写则默认为public。
public @interface Info {
String value() default "ZhouYM";
int score();
}
上面一段自定义注解的代码表示创建了@Info这一注解,其中第一个参数为value,默认值为ZhouYM;第二个参数为isDelete。在使用的时候,没有写默认值的参数必须传值。
反射是java中的高级特性,指的是程序在运行期间借助反射 API 取得任何类的内部信息,并通过这些内部信息去操作对应对象的内部属性和方法。
任何一个类,在第一次使用时,就会被 JVM 加载到堆内存的方法区中。JVM 加载类成功后,就会在方法区中产生一个对应的 Class 对象(一个类只要一个 Class 对象),这个 Class 对象包含被加载类的全部结构信息。反射本质上就是通过反编译的方式获取这个class对象,并进行与类有关的操作,如新建对象等。
反射给Java带来了一些动态性,且可以获得类在JVM中的很多信息,可以做到很多其他方法不能完成的事。反射可以和注解一起使用,这是用new等方法所不能做到的,同时将类名写入配置文件,从配置文件中获取时,也需要用到反射的方法获取类进而创建对象,而不能用new的方法实例化。
(1)forName和getDeclaredMethod的简单使用
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("org.Reflection.User");
Method methods = clazz.getDeclaredMethod("getName");
dm.setAccessible(true);//设置私有方法可访问
Object obj = dm.invoke(u2);
System.out.println(obj);
}
}
(2)forName和getDeclaredField的简单使用
public class Demo {
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("org.Reflection.User");
Object obj = clazz.newInstance();
Field nf = clazz.getDeclaredField("name");
nf.setAccessible(true);//设置私有变量可访问
nf.set(obj, "ZhouYM");
Object object = nf.get(obj);
System.out.println(object);
}
}
以上便是我在学习了注解和反射,并做了一些简单练习后的学习笔记。今后我会尝试将注解和反射结合在一起使用,并继续更加深入的学习,了解它们更为深入的原理,并在实际开发和练习过程中多多使用。