### 补充拓展
###代理
1. invocationHandler(调用处理器)。无论何时调用代理对象的方法,调用处理器都会进行拦截,然后执行自己的invoke方法。
2. 调用处理器的invoke方法每次都会讲拦截的Method对象和调用参数传递给invoke方法,调用处理器必须给出处理调用的方式。
3. 想要创建一个类需要调用proxy的newProxyInstance方法。
4. 记住一个代理类是一个运行时才创建的类,我们没法事先定义这个类,所有他只有一个实例域——调用处理器。所有需要附加的数据都必须存储在调用处理器中
5. 没有定义代理类的名字,虚拟机中的proxy类将生成一个字符串$Proxy开头的类名
6. 代理类一定是public和final的。
7.
##注解
* 注解的概念
* JDK1.5的新特性
* 注解相当于一个标记,用来给类携带信息,也是类的组成部分
* 注解可以使用在类,接口,方法,成员变量,构造方法等成员上
* 注解是给编译器或者JVM看的,编译器或JVM可以根据标记来做对应的事情
* 注解的作用
1. 生成帮助文档(javadoc)
2. 框架的配置
1. XML的配置
1. 优点 配置信息和类的信息分离开,降低了耦合性
2. 缺点 每一个javabean(实体类)都要对应一个XML配置文件,如果类很多,XML也会很多,提高了维护成本
2. 注解配置
1. 优点:直接将配置信息写在类中,提高了程序的可读性
2. 缺点:增强了耦合性
* Hibernate(对象与数据库的相互转换)
* Student类 Student.hhm.xml
##注解的使用
java中常用的注解(内置注解)
1.Deprecated(过时的)
2.supressWarnning(抑制编译器警告)
注意点:
1. 注解的属性的修饰符可以是默认的或者共公有的,不能使private修饰的
2. 注解默认的作用范围是retention。class,在运行阶段是没有的,如果要在运行中解析注解,必须保证作用范围是Runtime
### 注解之内置注解的使用
* Java常用的内置注解
* @Override
* 用来修饰方法,表示该方法是重写父类的方法。
* @Deprecated
* 用来修饰类的成员,表示该成员已经过时,不建议使用了。但还可以使用。
* @SuppressWarmings
* 抑制编译器警告
* 常见参数值的说明:
* unchecked:忽略安全检查,比如集合左边指定泛型,右边不指定。
* rawtypes:忽略类型安全,比如集合两边没有指定泛型不要警告
* unused:忽略不使用,比如定义局部变量后,后面没有再使用。
* null:忽略空指针,比如定义一个字符串赋值null,然后调用方法。
* static-access:忽略对象调用静态成员警告。
* serial:忽略未提供序列号。
* all:忽略所有警告
### 注解之自定义注解
* 注解的定义格式
* public @interface 注解名 {
}
* 注解属性定义格式
* 数据类型 属性名();
* 比如:String name();
* 数据类型 属性名() default 默认值;
* 比如:int age() default 18;
* 注解的特殊属性:value
* 当注解只有一个属性且名字为value时,在使用注解时可以直接给value属性赋值而不需要给出属性名。
* 当注解中除了value属性之外还有其他属性,且其他属性中有一个属性没有默认值,则在使用注解时value属性名也不能省略。
* 注意事项
* 使用注解时,如果属性没有默认值,则必须给属性赋值。
* 使用注解时,如果属性有默认值,则可以不用给该属性赋值。其值就是默认值。
### 注解之元注解
* 元注解的概述
* Java官方提供的给开发者使用。
* 元注解就是用来定义注解的注解。
* Java的内置注解的定义中都使用了元注解。
* 四个元注解
* @Target
* 用来指明自定义注解使用在哪个位置,默认是任何地方都可以使用。比如类,接口,方法....
* ElementType枚举类的常用值
* ElementType.TYPE 类或接口
* ElementType.METHOD 成员方法上
* ElementType.FIELD 成员变量上
* ElementType.CONSTRUCTOR 构造方法上
* ElementType.LOCAL_VARIABLE 局部变量上
* @Retention
* 指定自定义注解的作用范围(有效范围)
* RetentionPolicy枚举类常用值
* RetentionPolicy.SOURCE
* 注解只作用在源代码阶段,生成的class文件和运行阶段不存在注解。
* RetentionPolicy.CLASS(默认值)
* 注解作用在源代码阶段,生成的class文件中,运行阶段不存在注解
* RetentionPolicy.RUNTIME
* 注解作用在任何阶段。
* @Inherited
* 表示该注解允许子类继承。
* @Documented
* 该注解在帮助文档中可以查看到。
### 注解解析
* 相关接口
* Annotation:是所有注解的父接口(父类)
* AnnotatedElement:定义了与注解解析的相关方法
* AnnotatedElement接口方法
* T getAnnotation(Class<T> annotationClass)
* 根据注解的Class对象获得注解对象。
* Annotation[] getAnnotations()
* 获得当前对象上使用的所有注解对象,返回数组。
* 当前对象指方法调用者
* Annotation[] getDeclaredAnnotations()
* 获得当前对象上使用的所有注解对象,返回数组。不包括父类继承下来的。
* 当前对象指方法调用者
* boolean isAnnotationPresent(Class annotationClass)
* 判断当前对象上是否使用了指定的注解,如果使用了则返回true,否则返回false
* 解析前须知
* Class,Constructor, Field, Method类实现了AnnotatedElement接口。
* 一定要注意解析的注解的运用对象和范围,必须要是对应目标上,且为runtime
* 解析注解原则
* 注解作用在哪个成员上,就使用该成员的对象去获得注解的信息。
* 比如:注解作用在成员方法上,那么就要通过方法的Method对象获取注解信息。
### 类加载器的概述
* 什么是类加载器
* 负责加载类的对象就是类加载器
* 类加载器的作用
* 将字节码文件加载到内存中,并创建一个Class对象。
* 类加载器的分类
* 引导类加载器
* BootstrapClassLoader 最底层的加载器。
* 由C和C++编写,不是Java中的类。
* 作用:加载JRE最基础的Java类,如rt.jar
* 扩展类加载器
* ExtClassLoader 由Java程序编写,是一个Java的内部类
* 作用:加载JRE中的扩展类
* 应用类加载器
* AppClassLoader 由Java程序编写,是一个Java的内部类
* 作用:加载ClassPath指定的jar(包括第三方的库)和自己编写的类。
* 须知
* ExtClassLoader和AppClassLoader都是java.lang.ClassLoader的子类
* 代码查看三种类加载器负责加载的路径
* 引导类加载器:sun.boot.class.path
* 扩展类加载器:java.ext.dirs
* 应用类加载器:java.class.path
* 如何得到类加载器
* 类名.class.getClassLoader();
* 类加载器加载机制:双亲委托机制

1) 应用类加载器AppClassLoader的父加载器是扩展类加载器ExtClassLoader
2) 扩展类加载器ExtClassLoader的父加载器是引导类加载器
BootstrapClassLoader
3) 注:不存在父类与子类的关系,除BootstrapClassLoader
它们都是Launcher的内部类。
### 类加载器的常用方法(ClassLoader)
* URL getResource(String name)
* 从src目录查找资源文件,根据资源名称获得对应的URL对象,不能使用 /
* URL对象的getPath() 获得绝对路径
* InputStream getResourceAsStream(String name)
* 从src目录查找资源文件,根据资源名称获得对应的字节输入流对象,不能使用 /
###注意事项:
* 与class类的方法的区别,class类调用这两个方法加/表示从scr目录开始找,不加表示从当前目录下
### 代理模式
* 代理模式的作用
* 为真实对象提供代理控制其他对象对真实对象的访问。
* 代理模式分类
* 静态代理
* 动态代理
* 代理模式涉及到的对象有以下几个
* 真实对象:比如明星
* 代理对象:比如经纪人
* 调用者: 比如粉丝
* 接口或抽象类
* 用来描述真实对象具备的能力。
* 代理对象的要求
* 要拥有和真实对象的能力(实现和真实对象相同的接口)
* 拥有真实对象作为成员变量
### 静态代理
* 静态代理概述
* 在程序运行之前,就已经创建和代理类和被代理类,并确定了代理对象和真实对象的关系。
* 优点和缺点
* 优点:可以不改变真实对象的方法对其功能进行增强。
* 缺点:
* 如果有多个真实对象都需要代理对象,则会创建多个代理类。
* 真实对象和代理对象要实现相同的接口,但接口中添加方法时,代理对象也需要实现方法。
### 动态代理
* 概述
* 在程序运行时,动态生成代理对象,不需要手动创建代理类和代理对象。
* 使用JDK提供代理类Proxy创建代理对象。
* Proxy类创建代理对象的方法如下
static Object newProxyInstance(ClassLoader loader,
Class[] interfaces, InvocationHandler h)
作用:动态创建代理对象并返回。
参数说明:
loader:负责加载目标对象类的类加载器
interfaces:目标对象实现的所有接口的class对象
h: InvocationHandler是一个接口,
需要传入一个实现了此接口的实现类。
* InvocationHandler接口的方法如下
Object invoke(Object proxy, Method method, Object[] args)
作用:对目标对象方法的增强或拦截。
参数说明:
proxy:在方法newProxyInstance()方法返回的代理对象,
该对象一般不要在invoke方法中使用,容易出现递归调用。
method:目标对象方法的Method对象
args:代理对象调用方法时传递的参数
返回值:是真实对象方法的返回值
* invoke方法使用注意事项
* 不要在invoke方法中通过proxy调用方法,会出现递归产生死循环。
* 因为当通过代理对象调用一个方法的时候,这个方法的调用就会被转发给InvocationHandler接口实现类的invoke方法来进行调用。
* 动态代理开发步骤
* 直接创建目标对象
* 通过Proxy类创建代理对象
* 调用代理方法,其实是调用InvocationHandler接口的invoke()方法
###代理
1. invocationHandler(调用处理器)。无论何时调用代理对象的方法,调用处理器都会进行拦截,然后执行自己的invoke方法。
2. 调用处理器的invoke方法每次都会讲拦截的Method对象和调用参数传递给invoke方法,调用处理器必须给出处理调用的方式。
3. 想要创建一个类需要调用proxy的newProxyInstance方法。
4. 记住一个代理类是一个运行时才创建的类,我们没法事先定义这个类,所有他只有一个实例域——调用处理器。所有需要附加的数据都必须存储在调用处理器中
5. 没有定义代理类的名字,虚拟机中的proxy类将生成一个字符串$Proxy开头的类名
6. 代理类一定是public和final的。
7.
##注解
* 注解的概念
* JDK1.5的新特性
* 注解相当于一个标记,用来给类携带信息,也是类的组成部分
* 注解可以使用在类,接口,方法,成员变量,构造方法等成员上
* 注解是给编译器或者JVM看的,编译器或JVM可以根据标记来做对应的事情
* 注解的作用
1. 生成帮助文档(javadoc)
2. 框架的配置
1. XML的配置
1. 优点 配置信息和类的信息分离开,降低了耦合性
2. 缺点 每一个javabean(实体类)都要对应一个XML配置文件,如果类很多,XML也会很多,提高了维护成本
2. 注解配置
1. 优点:直接将配置信息写在类中,提高了程序的可读性
2. 缺点:增强了耦合性
* Hibernate(对象与数据库的相互转换)
* Student类 Student.hhm.xml
##注解的使用
java中常用的注解(内置注解)
1.Deprecated(过时的)
2.supressWarnning(抑制编译器警告)
注意点:
1. 注解的属性的修饰符可以是默认的或者共公有的,不能使private修饰的
2. 注解默认的作用范围是retention。class,在运行阶段是没有的,如果要在运行中解析注解,必须保证作用范围是Runtime
### 注解之内置注解的使用
* Java常用的内置注解
* @Override
* 用来修饰方法,表示该方法是重写父类的方法。
* @Deprecated
* 用来修饰类的成员,表示该成员已经过时,不建议使用了。但还可以使用。
* @SuppressWarmings
* 抑制编译器警告
* 常见参数值的说明:
* unchecked:忽略安全检查,比如集合左边指定泛型,右边不指定。
* rawtypes:忽略类型安全,比如集合两边没有指定泛型不要警告
* unused:忽略不使用,比如定义局部变量后,后面没有再使用。
* null:忽略空指针,比如定义一个字符串赋值null,然后调用方法。
* static-access:忽略对象调用静态成员警告。
* serial:忽略未提供序列号。
* all:忽略所有警告
### 注解之自定义注解
* 注解的定义格式
* public @interface 注解名 {
}
* 注解属性定义格式
* 数据类型 属性名();
* 比如:String name();
* 数据类型 属性名() default 默认值;
* 比如:int age() default 18;
* 注解的特殊属性:value
* 当注解只有一个属性且名字为value时,在使用注解时可以直接给value属性赋值而不需要给出属性名。
* 当注解中除了value属性之外还有其他属性,且其他属性中有一个属性没有默认值,则在使用注解时value属性名也不能省略。
* 注意事项
* 使用注解时,如果属性没有默认值,则必须给属性赋值。
* 使用注解时,如果属性有默认值,则可以不用给该属性赋值。其值就是默认值。
### 注解之元注解
* 元注解的概述
* Java官方提供的给开发者使用。
* 元注解就是用来定义注解的注解。
* Java的内置注解的定义中都使用了元注解。
* 四个元注解
* @Target
* 用来指明自定义注解使用在哪个位置,默认是任何地方都可以使用。比如类,接口,方法....
* ElementType枚举类的常用值
* ElementType.TYPE 类或接口
* ElementType.METHOD 成员方法上
* ElementType.FIELD 成员变量上
* ElementType.CONSTRUCTOR 构造方法上
* ElementType.LOCAL_VARIABLE 局部变量上
* @Retention
* 指定自定义注解的作用范围(有效范围)
* RetentionPolicy枚举类常用值
* RetentionPolicy.SOURCE
* 注解只作用在源代码阶段,生成的class文件和运行阶段不存在注解。
* RetentionPolicy.CLASS(默认值)
* 注解作用在源代码阶段,生成的class文件中,运行阶段不存在注解
* RetentionPolicy.RUNTIME
* 注解作用在任何阶段。
* @Inherited
* 表示该注解允许子类继承。
* @Documented
* 该注解在帮助文档中可以查看到。
### 注解解析
* 相关接口
* Annotation:是所有注解的父接口(父类)
* AnnotatedElement:定义了与注解解析的相关方法
* AnnotatedElement接口方法
* T getAnnotation(Class<T> annotationClass)
* 根据注解的Class对象获得注解对象。
* Annotation[] getAnnotations()
* 获得当前对象上使用的所有注解对象,返回数组。
* 当前对象指方法调用者
* Annotation[] getDeclaredAnnotations()
* 获得当前对象上使用的所有注解对象,返回数组。不包括父类继承下来的。
* 当前对象指方法调用者
* boolean isAnnotationPresent(Class annotationClass)
* 判断当前对象上是否使用了指定的注解,如果使用了则返回true,否则返回false
* 解析前须知
* Class,Constructor, Field, Method类实现了AnnotatedElement接口。
* 一定要注意解析的注解的运用对象和范围,必须要是对应目标上,且为runtime
* 解析注解原则
* 注解作用在哪个成员上,就使用该成员的对象去获得注解的信息。
* 比如:注解作用在成员方法上,那么就要通过方法的Method对象获取注解信息。
### 类加载器的概述
* 什么是类加载器
* 负责加载类的对象就是类加载器
* 类加载器的作用
* 将字节码文件加载到内存中,并创建一个Class对象。
* 类加载器的分类
* 引导类加载器
* BootstrapClassLoader 最底层的加载器。
* 由C和C++编写,不是Java中的类。
* 作用:加载JRE最基础的Java类,如rt.jar
* 扩展类加载器
* ExtClassLoader 由Java程序编写,是一个Java的内部类
* 作用:加载JRE中的扩展类
* 应用类加载器
* AppClassLoader 由Java程序编写,是一个Java的内部类
* 作用:加载ClassPath指定的jar(包括第三方的库)和自己编写的类。
* 须知
* ExtClassLoader和AppClassLoader都是java.lang.ClassLoader的子类
* 代码查看三种类加载器负责加载的路径
* 引导类加载器:sun.boot.class.path
* 扩展类加载器:java.ext.dirs
* 应用类加载器:java.class.path
* 如何得到类加载器
* 类名.class.getClassLoader();
* 类加载器加载机制:双亲委托机制

1) 应用类加载器AppClassLoader的父加载器是扩展类加载器ExtClassLoader
2) 扩展类加载器ExtClassLoader的父加载器是引导类加载器
BootstrapClassLoader
3) 注:不存在父类与子类的关系,除BootstrapClassLoader
它们都是Launcher的内部类。
### 类加载器的常用方法(ClassLoader)
* URL getResource(String name)
* 从src目录查找资源文件,根据资源名称获得对应的URL对象,不能使用 /
* URL对象的getPath() 获得绝对路径
* InputStream getResourceAsStream(String name)
* 从src目录查找资源文件,根据资源名称获得对应的字节输入流对象,不能使用 /
###注意事项:
* 与class类的方法的区别,class类调用这两个方法加/表示从scr目录开始找,不加表示从当前目录下
### 代理模式
* 代理模式的作用
* 为真实对象提供代理控制其他对象对真实对象的访问。
* 代理模式分类
* 静态代理
* 动态代理
* 代理模式涉及到的对象有以下几个
* 真实对象:比如明星
* 代理对象:比如经纪人
* 调用者: 比如粉丝
* 接口或抽象类
* 用来描述真实对象具备的能力。
* 代理对象的要求
* 要拥有和真实对象的能力(实现和真实对象相同的接口)
* 拥有真实对象作为成员变量
### 静态代理
* 静态代理概述
* 在程序运行之前,就已经创建和代理类和被代理类,并确定了代理对象和真实对象的关系。
* 优点和缺点
* 优点:可以不改变真实对象的方法对其功能进行增强。
* 缺点:
* 如果有多个真实对象都需要代理对象,则会创建多个代理类。
* 真实对象和代理对象要实现相同的接口,但接口中添加方法时,代理对象也需要实现方法。
### 动态代理
* 概述
* 在程序运行时,动态生成代理对象,不需要手动创建代理类和代理对象。
* 使用JDK提供代理类Proxy创建代理对象。
* Proxy类创建代理对象的方法如下
static Object newProxyInstance(ClassLoader loader,
Class[] interfaces, InvocationHandler h)
作用:动态创建代理对象并返回。
参数说明:
loader:负责加载目标对象类的类加载器
interfaces:目标对象实现的所有接口的class对象
h: InvocationHandler是一个接口,
需要传入一个实现了此接口的实现类。
* InvocationHandler接口的方法如下
Object invoke(Object proxy, Method method, Object[] args)
作用:对目标对象方法的增强或拦截。
参数说明:
proxy:在方法newProxyInstance()方法返回的代理对象,
该对象一般不要在invoke方法中使用,容易出现递归调用。
method:目标对象方法的Method对象
args:代理对象调用方法时传递的参数
返回值:是真实对象方法的返回值
* invoke方法使用注意事项
* 不要在invoke方法中通过proxy调用方法,会出现递归产生死循环。
* 因为当通过代理对象调用一个方法的时候,这个方法的调用就会被转发给InvocationHandler接口实现类的invoke方法来进行调用。
* 动态代理开发步骤
* 直接创建目标对象
* 通过Proxy类创建代理对象
* 调用代理方法,其实是调用InvocationHandler接口的invoke()方法