注解和反射
何为java注解
官方的定义是这样的:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
作用分类:
- ①编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】
- ② 代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
- ③编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】
我的理解
注解是一个标识,可以标识在类上,可以标识在方法上,也可以标识在某些属性上,注解是给机器看的符号,注解要保留在内存上,因为jvm只能在内存里读取数据。注解一般配合反射使用做一些判断。
java反射
Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。简单的说就是,就是在程序运行的时候,允许对其内部的成员进行操作,比如创建对象,调用方法啥的
注解和反射实例演示
首先先写一个注解就叫MyAnnotation
package com.xu.demo.test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}
接着我们写一个类有4个方法
public class demo {
public void save(){
System.out.println("保存方法--------------------");
}
public void update(){
System.out.println("更新方法--------------------");
}
@MyAnnotation
public void deleteAll(){
System.out.println("删库方法--------------------");
}
@MyAnnotation
public void run(){
System.out.println("跑路方法--------------------");
}
}
我在删库和跑路方法上加了我写的注解,我要告诉机器,你看到有我写的注解你就执行这个方法,其他的不要执行
接着我们写main方法启动程序,通过反射获取对象,获取对象的所有方法
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException {
//获取Class 反射
Class testClass = Class.forName("com.xu.demo.test.demo");
//创建对象
Object o = testClass.newInstance();
//获取该对象的所有方法
Method[] allMethods = testClass.getDeclaredMethods();
for (Method method : allMethods) {
//判断这个方法上是否有我自己写的zhuj
if(method.isAnnotationPresent(MyAnnotation.class)){
method.invoke(o);
}
}
}
运行结果
非常完美哈哈哈