- 基础加强
- 一回顾泛型
- 二泛型的反射
- 三注解
基础加强
一、回顾泛型
- 泛型的基本概念:
- 以
ArrayList<E>
为例: - ①
ArrayList<E>
中的E称为类型参数变量 ArrayList<Integer>
中的Integer称为实际类型参数- ②整个
ArrayList<E>
称为泛型类型 - 整个
ArrayList<Integer>
称为参数化的类型(ParameterizedType) - 定义一个泛型方法:
:
// <T>:泛型定义的声明,在返回值前面。
public <T> T findOne(Class<T> clazz) {}
// 对于静态泛型方法,都必须自己定义后才能使用
public static <T> void findTwo(){}
// 定义多个泛型
public static <K,V> V find(K k);
- 定义一个带泛型的类:
// 类级别的泛型定义,类中的"实例方法"就可以直接使用了。
public class Demo<T> {}
二、泛型的反射
// 获取带有泛型信息的父类,例如:BaseDao<User>,这个整体称为:ParameterizedType,Type是Class类的接口
Type type = XXX.class.getGenericsSuperclass();
ParameterizedType ptype = type;
Clazz clazz = ptype.getActualTypeArguments()[0];
三、注解
- 介绍
- ①从JDK5.0开始,Java增加对元数据(MetaData)的支持,也就是注解(Annotation)。
- ②Annotation其实就是代码里的特殊标记,它用于代替配置文件。传统的方式中,使用配置告诉类如何运行,有了注解以后,开发人员可以通过注解告诉类如何运行。
- ③在Java技术里注解的典型应用是:可以通过反射技术得到类里面的注解,以决定怎么样运行类。
- 基本的注解
- ① SupperssWarnings:抑止警告
- 自定义注解
-
① 注解的定义
public @interface MyAnnotation {}
-
② 注解的属性:既不像方法,也不像字段。注解属性能够使用的类型:primitive(基本类型),String,Class,Annotation,enum或者是以上类型的一维数组。
如果给注解中的属性赋值,可以只指定一个值,也可以指定多个值。
public @interface MyAnnotation_1 { // 注解的属性 String name(); // 带默认值的属性 int age() default 18; }
-
③ 使用注解及属性:public class UseAnnotation { @MyAnnotation_1(name = "ABC", age = 18) public void test1(){} }
- 注解的反射
- 涉及到的API:java.lang.reflect.AnnotatedElement
-
Class,Constructor,Field,Method,Packages都实现了该接口。// 获取自己所拥有的指定的注解类型,aType是一个注解类型的字节码对象。 Annotation getAnnotataion(Class<T> aType); // 返回所有的注解 Annotation[] getAnnotations(); // 判断自己有没有指定的注解类型 boolean isAnnotationPresent(Class<? extends Annotation> aType);
- 类的三种状态
-
① SOURCE: .java文件② CLASS: .class文件
③ RUNTIME:内存中的class,由类加载器把.class文件加载入内存。
- 注解使用的生命周期
- ① 注解的默认存放的范围是:字节码状态。运行时(RUNTIME)是没有的。
- 使用元注解改变注解的存活范围
-
① 只能用于注解的注解,就是元注解。@Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation_1 {}
- 使用元注解改变注解的放置位置
- ① 放在类上:@Target(ElementType.TYPE)
-
② 放在方法上:@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface MyAnnotation_1 { }
时间: 2024-10-24 20:05:35