------- android培训、java培训、期待与您交流! ----------
5.内省:IntroSpector(检查视察)--->javaBeen-->特殊的java类
JavaBeen:
(1)JavaBeen是一种特殊的Java类,主要用于传递数据信息,这种Java类中的方法主要用访问私有的字段, 且方法名符合某种命名的规则
(2)一个符合javaBeen特点的类可以当做普通类也可当做javaBeen来操作,为什么要当做javaBeen来操作肯定是因为他可以带来额外的好处?
(1)在javaee开发中经常要使用到javaBeen,很多环境要求按javaBeen的方式进行操作
别人都这么要求,和这么用那我们也只能这么做
(2)jdk中提供了对JavaBeen进行操作的API被称之为内省Introspector,
如果是自己同过getX来访问私有的x会有一定的难度,用内省这套API来操作javaBeen就比普通方法要简便
(3)javaBeen内省获取和设置内容:
方式一:创建propertyDescriptor对象(建议,简单)
方式二:遍历BeenInfo的所有属性方式查找和设置某个RefectPoint对象的x属性
Beenutils:
(1)由于对javaBeen的属性的设置和获取应用比较广泛,所以Apache为我们提供了Beenutils工具包
(2)在一个工程下添加jar包
创建文件lip-->Copyjar包-->BuilderPath-->Add to Bilder Path
(3)设置获取javaBeen属性的值
获取:System.out.println(BeenUtils.getProperty(p,"x"));
设置:BeenUtils.setProperty(p,"x","4");
设置复合属性;(属性连功能)
获取:BeenUtils.setProperty(p,"birthday.time","222");
获取:BeenUtils.getProperty(p,"birthday.time");
优点:BeenUtils工具包可以自动将字符串转换为javaBeen的属性类型再返回字符串
(4)可以将javaBeen属性转化为Map集合describe,也可以将Map转换为javaBeen,populate
jdk1.7新特性
Map map = {name:"张三",age:23};
BeenUtils.set(map,"name","李四");map的key相等于javaBeen的属性
(5)PropertyUtils:
PropertyUtils.setPropertyUtils(p,"x",10);
PropertyUtils.getPropertyUtils(p,"x");
是以属性本身的类型进行操作
6.注解;(jdk1.5新特性)
1.注解相等于一种标记,在程序中加了注解就等于为程序加了某种标记,以后在操作该类时作相应的事
注解可以加在包,类,字段,方法,方法参数以及局部变量上
Deprecated Retention(Value=SOURCE)
Override Retention(Value=SOURCE)
SuppressWarning Retention(Value=RUNTIME)
2.注解类:new Annotation
3.应用了"注解类"的类:添加注解类--判断是否有注解--如果有得到注解--加元注解
元注解(Retention(保留到在哪一个生命周期),Target(用在哪个成分上))
4.对"应用了注解类的类"进行反射的类
5.一个注解的生命周期有三个阶段
java源文件--class文件--内存中的字节码
通过Rentention可以把注解声明在任意阶段(默认在class阶段)
RetentionPolicy是一个枚举有三个取值
6.为注解添加高级属性
1.数组类型的属性
2.枚举类型的属性
3.注解类型的属性
4.八个基本类型
5.String类型
6.Class类型
7.泛型:(jdk1.5新特性)
(1)ArrayList<E>类定义的一些术语
整个称为ArrayList<E>泛型类型
ArrayList<E>中的E称为类型变量或类型参数
整个ArrayList<Integer>称为参数化类型
ArrayList<Integer>中的Integer称为类型参数的实例或实际类型参数
ArrayList<Integer>中的<>念typeof
ArrayList称为原始类型
(2)参数化类型和原始化类型的兼容
参数化类型可以引用一个原始类型的对象,编译报警告
Collection<String> c = new Vector();
原始类型可以引用一个参数化类型的对象,编译报警告
Collection c = new Vector<String>();
(3)参数化类型不考虑类型参数的继承关系
Vector<String> v = new Vector<Object>();//编译错误不写Object正确
Vector<Object> v = new Vector<String>();//错误
(4)在创建数组实例时,数组的元素不能使用参数化的类型
Vector<Integer> vectorList[] = new Vector<Integer>[10];//错误
(5)泛型的优点:
1.提高安全性,优化代码
2.将运行时期异常提前编译期
3.避免了强制类型转换
8.泛型中的?通配符:
(1)用?通配符不能调用与类型有关的方法,可以调用其他各种参数化的类型;
(2)通配符的扩展:(限定通配符总是包括自己)
向上限定:Vector<? extends Number> v = new Vector<Integer>();必须是Number或Number的子类
向下限定:Vector<? super Integer> v= new Vector<Number>();必须是Integer或Integer的父类
(3)泛型的遍历
(4)只有引用类型才能作为泛型的实际参数,基本类型不可以
(5)当一个变量被声明为泛型时 ,只能被实例变量和方法调用,而不能被静态调用因为静态成员是被所有参数化的类
类所共享不应该有类级别的类型参数
(6)通过反射获得泛型的实际类型参数
9.类加载器:
(1)类加载器:加载类的工具,作用是:将硬盘中的.class文件加载到内存中并进行处理
(2)java虚拟机可以安装多个类加载器,类加载器也是java类但BootStrap不是,
java虚拟机的类加载器采用具有父子关系的树形结构进行组织
(3)java虚拟机在加载一个类时到底派出谁来加载呢?
1.首先当前线程的类加载器去加载线程中的第一个类;
2.如果A类中引用了B类,java虚拟机间使用加载类A的类加载器去加载类B
3.还可以直接调用ClassLoader.loadClass()方法制定某个类加载器去加载某个类
(4)可不可以自己写一个java.lang.System?
通常不可以,因为类加载器的委托机制,会交给顶级类加载器来加载,在rt.jar包中
就直接加载了而不会执行到lassPath路径下,如果一定要执行可以制定自己的类加载器,
不能再使用类加载器的委托机制
(5)每个类加载器加载类时,又先委托给其上级类加载器:
当所有的祖宗类加载器没有加载到类,回到启发这类加载器,还加载不了,则抛ClassNotFoundException异常
不会再找发起者类加载器的儿子因为没有getChid方法,即使有那么多儿子,用谁加载呢?
10.代理:
(1)代理和目标类有相同的接口,在代理类的前后加上一些系统功能
(2)采用工程模式和配置文件方式进行管理,就不需要再改客户端,而是在配置文件中切换是要用目标类还是代理类,
(3)交叉业务的编程问题即为面向方面的编程(Aspect oriented program简称AOP)代理是实现AOP的核心和关键技术
(4)jvm可以在运行期动态生成类的字节码,这种动态生成的类往往被用作代理类即动态代理
(5)jvm生成的动态类必须实现一个或多个接口,所以jvm生成的动态类中能用作具有相同接口的目标类代理
(6)CGLIB库可以动态生成一个类的子类,一个类如果没有是实现接口,就可以使用CGLIB库来动态生成这个类的代理
(7)代理类的各个方法中通常除了要调用目标相应方法和对外返回目标返回的结果外,还可以在代理方法中如下四个
位置加入系统功能代码:
1.在调用目标方法之前
2.在调用目标方法之后
3.在调用目标方法前后
4.在处理目标方法异常的catch快中
(8)编写对class文件进行加密的工具类
(9)编写和测试自己编写的解密类加载器
(10)编写可生成代理和插入通告的通用方法
(11)实现类似spring的可配置的AOP框架