Java注解与反射学习笔记

一、注解

1、概念

注解就是源代码的元数据,通熟的讲就是代码中的标签。

java中注解主要用于标记代码,或结合其他方法,如反射,实现值的传递。另外,注解在框架中也使用较多。

java中有7种自带的注解,包括@Override, @Deprecated, @SuppressWornings 和四种元注解(表示注解的注解)。jdk7后,逐步增加为10种。

(1)按来源分

  • JDK 自带注解;

  • 第三方注解,如Spring框架中的RequestMapping注解等;

  • 自定义注解,使用 @interface 关键字定义。

(2)按生命周期划分

  • SOURCE:只存在于源代码中,编译成 class 文件就不存在了。

  • Class:存在于源代码中和 class 文件中。

  • RUNTIME:注解保留到运行时。

2、java中自带的注解

(1)三种基本注解

  • @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
  • @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
  • @SuppressWarnings - 指示编译器去忽略注解中声明的警告。

(2)四种元注解

  • @Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问(即属于前面定义的三种生命周期中的哪一种)。
  • @Documented - 标记这些注解是否包含在用户文档中。
  • @Target - 标记这个注解应该是哪种 Java 成员。
  • @Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何类)

(3)新增注解
从 Java 7 开始,额外添加了 3 个注解:

  • @SafeVarargs - Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
  • @FunctionalInterface - Java 8 开始支持,标识一个匿名函数或函数式接口。
  • @Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次。

在java自带的注解中,我在练习中使用到最多的是@Override和@Retention。

3、自定义注解

自定义注解的关键字为@interface,且修饰符必须为public而不能为其它,不写则默认为public。


public @interface Info {
     
    String value() default "ZhouYM";
    int score();
}

上面一段自定义注解的代码表示创建了@Info这一注解,其中第一个参数为value,默认值为ZhouYM;第二个参数为isDelete。在使用的时候,没有写默认值的参数必须传值。

二、反射

1、概念

反射是java中的高级特性,指的是程序在运行期间借助反射 API 取得任何类的内部信息,并通过这些内部信息去操作对应对象的内部属性和方法。

任何一个类,在第一次使用时,就会被 JVM 加载到堆内存的方法区中。JVM 加载类成功后,就会在方法区中产生一个对应的 Class 对象(一个类只要一个 Class 对象),这个 Class 对象包含被加载类的全部结构信息。反射本质上就是通过反编译的方式获取这个class对象,并进行与类有关的操作,如新建对象等。

反射给Java带来了一些动态性,且可以获得类在JVM中的很多信息,可以做到很多其他方法不能完成的事。反射可以和注解一起使用,这是用new等方法所不能做到的,同时将类名写入配置文件,从配置文件中获取时,也需要用到反射的方法获取类进而创建对象,而不能用new的方法实例化。

2、反射中的常用函数

  • Class.forName(“具体类名”),用于获取类
  • 类.newInstance(),用于创建前面获取的类的新对象
  • c.getConstructors(),使用类的构造函数
  • Method md = 类对象.getMethod(“类中的公有方法名”),用于获取共有方法
  • Method dm = 类对象.getDeclaredMethod(“类中的私有方法名”),用于获取该类的所有方法
  • Object obj1 = md.invoke(in,“ZhouYM”),使用方法
  • Field names = 类对象.getField(“成员变量名”),获取公有成员变量
  • Field names = 类对象.getDeclaredField(“成员变量名”);af.setAccessible(true);,获取所有成员变量

3、反射的简单实例

(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);
	}
 
}

三、总结

以上便是我在学习了注解和反射,并做了一些简单练习后的学习笔记。今后我会尝试将注解和反射结合在一起使用,并继续更加深入的学习,了解它们更为深入的原理,并在实际开发和练习过程中多多使用。

你可能感兴趣的:(JAVA,SE,java,反射,javase,编程语言)