------------------ android培训、java培训
//=====================================================================
//@TITLE:
// 高新技术day3
//@AUTHOR:
// Benwolf
//=====================================================================
入门泛型的基本应用:
JDK1.5以前的集合类中存在的问题
eg:ArraryList collection = new ArraryList();
collection.add(1);
collection.add(1L);
collection.add("abc");
int i = (Integer)arraryList.get(1);//编译要强制类型转换且运行时出错!
JDK1.5的新特性--泛型
使用泛型集合,可以将一个集合中的元素限定为一个特定类型,集合中只能存储同一个类型的对象,这样更安全;并且从集合获取一个对象是,编译器也可以知道这个对象的类型,不需要对对象进行强制类型转换,使用更方便。
泛型通配符:
限定通配符的上边界:
extends表示仅限于Number或限于Number的子类。
正确:Vector<? extends Number> x = new Vector<Integer>();
错误:Vector<? extends Number> x = new Vector<String>();
限定通配符的下边界:
super表示仅限于Integer的父类,限定下边界,最低往下也必须是Integer。
正确:Vector<? super Integer> x = new Vector<Number>();
错误:Vector<? super Integer> x = new Vector<Byte>();
泛型集合的综合应用:
eg:
HashMap不能遍历 Map.Entry<>可以遍历
HashMap<String,Integer> maps = new HashMap<String,Integer>();
maps.put("jeff",22);
maps.put("ice",22);
maps.put("juice", 1);
Set<Map.Entry<String,Integer>> entrySet = maps.entrySet();
for(Map.Entry<String, Integer> entry : entrySet){
System.out.println(entry);
}
定义泛型的方法:
用于放置泛型类型的参数的尖括号应出现在方法的其他所有修饰符之后和在方法的返回类型之前,也就是紧邻返回值之前。按照惯例,类型参数通常用单个大写字母表示。只有引用类型才能作为泛型类型的参数,不能为基本类型。
eg:
private static <T> void swap(T[] a,int i,int j){
T temp = a[i];
a[i] = a[j];
a[j] = temp;
}
add(3,5);
Number x1 = add(3.5,3);
Object x2 = add(3,"abc");
自定义泛型的方法及其应用:
Java语言中的泛型完全是在编译器中实现,用于编译器执行类型检查和类型的推断,然后生成普通的非泛型的字节码,这种实现技术称为擦除(erasure)
Dao缩写——data acess object-->crud 对数据库的增删改查 creat、read、update、delete
如果类的实例对象中多处都要用到一个泛型参数,即这些地方引用的泛型类型要保持同一个实际类型是,这时候就要采用泛型类型的方式进行定义,也就是类级别的泛型语法如下:
下面的方法可以对传进来什么类和返回什么类。
eg:
public class GenericDao<T>{
public void add(E x){
}
public E findById(int id){
}
public void delete(T obj){
}
public void delete(int id){
}
public void update(T obj){
}
public Set<T> findByConditions(String where){
return null;
}
........
}
在用的时候需要指定对应类型——类级别的泛型是i根据引用该类名时指定的类型信息来参数化类型变量的。
GenericDao<ReflectPoint> dao= new GenericDao<ReflectPoint>();
重点:参数化类型不支持方法重载。
类加载器及其委托机制的深入分析:
java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个负责加载特定位置的类:BootStrap、 ExtClassLoader、 AppClassLoader
对应管辖范围:JRE/lib/rt.jar、Jre/lib/ext/*.jar、CLASSPATH指定目录的所有jar或目录
类加载器也是java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是java类,这正是BootStrap。
类加载器之间的父子关系和管辖范围图:
1、首先当线程的类加载器去加载线程中的第一个类。
2、如果类A中引用的类B,java虚拟机将使用加载类A的类装载器来加载类B。
3、还可以直接调用ClassLoader.loadClass()方法来指定某个加载器去加载某个类。
自定义类加载器的编写原理分析:
写自己的类加载器,字节的类加载器覆盖findClass(),就可以获取到对应的字节码,将这些字节码交给definClass()方法将其变成Class对象
原理示意图:
AOP(Aspect Oriented Program面向方面的变成):
交叉业务:安全、实物、日志等功能要贯穿到好多个模块中。
AOP的目标就是要使交叉业务模块化,可以采用将切面代码移动到原始方法的周围,这与直接在方法中编写切面代码的运行效果一样。
AOP
1. 系统中存在交叉业务,一个交叉业务就是要切入到系统中的一个方面,如下所示:
安全 事务 日志
a) Student Service ----------|-----------|----------|----------
b) CourseService ----------|-----------|----------|----------
c) MiscService ------------|-----------|----------|----------
2. 用具体的程序代码描述交叉业务:
a) method1 method2 method3
b) { { {
c) ------------------------------------------------切面
d) ------ -------- ------
e) ------------------------------------------------切面
f) } } }
3. 交叉业务的编程问题即为面向方面的编程(Aspect oiented program ,简称AOP),AOP的目标就是要使交叉业务模块化。可以采用将切面代码移动到原始方法的周围,这与直接在方法中编写切面代码的运行效果是一样的。如下所示:
a) --------------------------------------------------切面
b) func1 func2 func3
c) { { {
d) --- --- ---
e) } } }
f) -------------------------------------------------切面
4. 使用代理技术正好可以解决这种问题,代理是实现AOP功能的核心和关键技术。
代理架构图:
工厂类BeanFactory负责创建目标类或代理类的实例对象,并通过配置文件实现切换。其getBean方法根据参数字符串返回一个相应的实例对象,如果参数字符串在配置文件中对应的类名不是ProxyFactoryBean,则直接返回该类的实例对象,否则,返回该类实例对象的getProxy方法返回的对象。