注解的最大作用就是配合反射机制。用于标识类,方法和变量。
一、自定义注解的创建和使用
1.创建
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoRunClass {
}
@Target(ElementType.TYPE) 定义注解的使用范围
ElementType.TYPE 作用在类上
ElementType.METHOD 作用在方法上
ElementType.FIELD 作用在变量上
@Retention(RetentionPolicy.RUNTIME) 定义注解在加载时会被编译,固定格式。
2.使用
boolean a= m.isAnnotationPresent(AutoRunMethod.class)
AutoRunMethod arm = m.getAnnotation(AutoRunMethod.class);
isAnnotationPresent(注解名.class)判断是否使用该注解。
getAnnotation 获取注解对象。
二、注解定义值和获取注解的值
1.1定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoRunMethod {
// int value();
int value() default 1; // 默认传参为1
}
1.2定义值
@AutoRunMethod(2)<------定义值
public void sayHello() {
System.out.println(name + "说:hello!");
}
2.获取注解值
Class cls = Class.forName("reflect.Person");
Method method = cls.getMethod("sayHello");
if (method.isAnnotationPresent(AutoRunMethod.class)) {
AutoRunMethod arm = method.getAnnotation(AutoRunMethod.class);
int d = arm.value(); <-----接受值
System.out.println("参数" + d);
}
method.isAnnotationPresent(AutoRunMethod.class) 判断方法是否调用了这个注解
cls.isAnnotationPresent(AutoRunClass.class); 判断类是否调用了这个注解
三、线程池
1.创建线程池
ExecutorService threadPool = Executors.newFixedThreadPool(2);
2.创建线程,放入线程池调用
for (int i = 0; i < 5; i++) {
Runnable r = new Runnable() {
@Override
public void run() {
Thread t = Thread.currentThread();
System.out.println(t.getName() + "正在执行任务");
System.out.println(t.getName() + ":任务执行完毕");
}
};
threadPool.execute(r); <--------放入线程池调用
System.out.println("指派了一个任务给线程池");
3.线程调用完毕结束线程池任务
threadPool.shutdownNow();