1) 内省:主要用于对JavaBean进行操作,JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省
2) JavaBean:
i. JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则
ii. 一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量
3) Beanutils工具包:
i. 加入beanutils包时,需要加入logging包
ii. 使用Beanutils包时,get属性时返回的结果为字符串,set属性时可以接受任意类型的对象,通常使用字符串
iii. 用PropertyUtils类,get属性时返回的结果为该属性本来的类型,set属性时只接受该属性本来的类型
4) 注解理解:
i. 注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,标记可以加在包、类、字段、方法的参数以及局部变量上。
ii. @SuppressWarnings("deprecation”):用javac编译多过时的方法,不会产生警告
iii. @Deprecated:被标记后,为过时的元素
iv. @Override:被标记后,表示覆盖父类的方法
四、泛型
1) 泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去除掉”类型”,使程序运行不受影响。
2) ArrayList<E>类定义和ArrayList<Integer>类中的术语:
i. 整个称为ArrayList<E>泛型类型
ii. ArrayList<E>中的E称为类型变量或类型参数
iii. 整个ArrayList<Integer>称为参数化类型
iv. ArrayList<Integer>中的Integer称为类型参数的实例或实际类型参数
v. ArrayList<Integer>中的<>念着typeof
vi. Arraylist称为原始类型
3) 参数化类型与原始类型的兼容性:
i. 参数化类型可以引用一个原始类型的对象,编译时报告警告
ii. 原始类型可以引用一个参数化类型的对象,编译时报告警告
iii. 参数化类型不考虑类型参数的继承关系
iv. 编译器不允许创建泛型变量的数组,即创建数组实例时,数组的元素不能使用参数化的类型
4) ?通配符:可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法
5) ?通配符的扩展:
i. 上边界:<? extends Number>包括自己和Number的子类
ii. 下边界:<? super Integer>包括自己和Integer的父类
iii. ?只能作用于引用,不能用它去给其他变量赋值
iv. 只有引用类型才能作为泛型方法的实际参数
v. 普通方法、构造方法和静态方法中都可以使用泛型
vi. 在泛型中可以同时有多个类型参数<K,V>
五、类加载器:
1) 默认的加载器:
i. BootStrap:管辖范围JRE/lib/rt.jar 子:ExtClassLoader
ii. ExtClassLoader:管辖范围:JRE/lib/ext/*.jar 子: AppClassLoader
iii. AppClassLoader:管辖范围:CLASSPATH指定的所有jar或目录 子:自定义的类加载器
2) 类加载器也是Java类,因为其他是java类的类加载器本省也要被类加载器加载,但是第一个BootStrap类加载器不是java类
3) 委托机制:
i. 当java虚拟机要加载一个类时,首先当前线程的类加载器去加载线程中的第一个类;如果类A中引用了类B,java虚拟机将使用加载类A的类装载器来加载类B;还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类
ii. 每个类加载器加载类时,先委托给其上级类加载器
4) 自定义类加载器:
i. 自定义的类加载器必须继承ClassLoader
ii. 类加载器不能加载非public的类
六、代理类
1) 代理类需要与目标类具有相同的接口,代理类的每个方法调用目标类的相同方法,并在调用方法时加上系统功能的代码
2) AOP:
i. 系统中存在交叉业务,一个交叉业务就是要切入到系统中的一个方面,交叉业务的变成问题即为面向方面的编程(Aspect oriented program,简称AOP)
ii. AOP的目标就是要使交叉业务模块化,代理是实现AOP功能的核心和关键技术
1) 动态代理:
i. JVM可以在运行期动态生成出类的字节码,这种动态生成的类往往被用作代理类,即动态代理类
ii. JVM生成的动态类必须实现一个或多个接口,所以,JVM生成的动态类只能用作具有相同接口的目标类的代理
iii. CGLIB库可以动态生成一个类的子类,一个类的子类也可以用做该类的代理,所以,如果一个没有实现接口的类生成动态代理类,那么可以使用CGLIB库