单元测试
@Test eclipse自带jar包 Ctrl+1导入使用
注解
JDK提供的注解
@Deprecated 表示被修饰的方法已经过时
@Override 重写方法 1.5支持父类不支持接口 1.5之后支持接口
@SuppressWarnings 抑制警告 需要给属性值 all 所有的警告都被抑制
({ })
"unused" 没有使用警告
"rawtypes" 类型不安全警告
"unchecked" 使用不安全 安全检查
"null" 空指针警告
"deprecation" 过时警告
"serial" 序列号警告
自定义注解
关键字 @interface
成员
public abstract 返回值类型 属性名() [defualt 属性值]
返回值类型
基本类型 String Class 注解 枚举 一维数组
注意:需要加上元注解才可以使用
@Retention 用于确定被修饰的自定义注解生命周期
value:RetentionPolity.SOURCE 被修饰的注解只能存在原码中,字节码Class没有。用途:提供给编译器使用
RetentionPolity.CLASS 被修饰的注解只能存在原码和字节码文件中,运行时内存中没有。用途:JVM java虚拟机使用
RetentionPolity.RUNTIME 被修饰的注解存在原码,字节码,内存(运行时)。用途:取代xml配置
@Target 用于确定被修饰的自定义注解使用位置
ElementType.TYPE 修饰类、接口
ElementType.CONSTRUCTOR 修饰构造方法
ElementType.METHOD 修饰方法
ElementType.FIELD 修饰字段
注解使用
使用格式
@注解类名(属性名=值,属性名=值,...)
应用在类,方法,构造方法,字段上
注意
如果属性名为value,且当前只有一个属性,value可以省略
如果属性类型为数组,设置内容格式为{1,2,3} 数组中只有一个元素时,大括号可省略
一个对象上,注解只能使用一次,不能重复使用
注解解析
java.lang.reflect.AnnotatedElement(接口,反射中的类实现)
boolean isAnnotationPresent(Class annotationClass) 当前对象是否有指定注解 参数为相应注解的字节码文件对象
T getAnnotation(Class<T> annotationClass) 获得当前对象上指定的注解 参数为相应的字节码文件对象 返回要获取的注解类型
注解中的值:
像获取静态常量一样 注解类型.属性名()
类加载器
全盘负责委托机制
全盘负责:A类如果要使用B类(不存在),A类加载器C必须负责加载B类
委托机制:A类加载器如果要加载资源B,必须询问父类加载是否加载
获取类加载器
ClassLoader loader = 类名.class.getClassLoader();
引导类加载器bootsrap 不是类,内置在jvm中 看不见(返回null)
核心类 rat.jar等
扩展类加载器 ext
扩展文件夹ext下的所有的类
应用加载器 app
自己写的类 第三方工具 CommonsIo dom4j (如果自己定义一个String类,在本包下不导包的话会直接加载自己定义的类)
动态代理(面向接口编程)
调用者----类
调用者----代理类-----类
Object(所实现接口) proxyObj = (所实现接口) Proxy.newProxyInstance(参数1,参数2,参数3)
参数1:ClassLoader 负责将动态创建类,加载到内存。当前类.class.getClassLoader()
参数2:Class[] interfaces 代理类需要实现的所有接口(确定方法)。被代理类实例.getClass().getInterfaces();
参数3:InvocationHandler 请求处理类,代理类不具有任何功能,代理类的每一个方法执行时,调用处理类的invoke方法
invoke(Object proxy, Method method, Object[] args)
参数1:代理实例
参数2:当前执行的方法
参数3:方法实际参数 (方法中3个参数都是Proxy自己传递的)
返回的是接口!!!
/*动态代理中的ClassCastException
* A:必须用接口的引用指向实现类的对象
* B:代理类返回的必须是接口类型 (MyInterface)Proxy.newProxyInstance()
* C:找到所有实现的接口的时候传入的必须是实际对象而不是接口的引用
* 动态代理是通过接口找到所有的方法,所以不能直接代理实现类(直接代理实现类会找不到实现类的特有方法)
*/