首页 > 代码库 > 黑马程序员_JAVA基础知识总结2
黑马程序员_JAVA基础知识总结2
IDE > Java Enterprise Edition
Java SE >1.在JavaEE开发中,经常要使用到JavaBean。很多环境要求按JavaBean方式进行操作。
IntroSpector:
PropertyDescript/Introspector/BeanUtils
注解> Java源文件
2.RetentionPolicy.CLASS > 内存中的字节码
@Target元注解用于表示自定义的注解可以用在哪些地方,通过ElementType的枚举元素来指定
泛型:
泛型指定的是未确定的"类"类型,不能使用基本数据类型做泛型的参数
限定类型,可以将集合中的元素限定为特定类型
类加载器的委托机制:
当Java虚拟机要加载一个类时,到底使用那个类加载器加载呢?
* 首先当前线程的类加载器去加载线程中的第一个类
* 如果A类中引用了B类,Java虚拟机将使用加载A类的类加载器来加载B类
* 还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类
* 每个类加载器加载类时,又先委托给其上级类加载器
* 当所有祖宗类加载器没有加载到类,回到发起者类加载器,如果还加载不到,就抛出ClassNotFoundException,而不是去找发起者类加载器的子类,因为没有getChild()方法,即使有,那如果有多个子类,又该选择哪一个呢?
代理:
要为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能,例如:异常处理,日志,计算方法的运行时间,事务管理等等,要怎么做呢?
* 可以编写一个与目标类具有相同接口的代理类,代理类的每个方法调用目标类的相同方法,并在调用时加上系统功能的代码。
* 如果采用工厂模式和配置文件的方式进行管理,则不需要修改客户端程序,在配置文件中配置是使用目标类还是代理类,切换就起来很方便,例如,想要日志功能时就配置代理类,否则就配置目标类,这样,在系统中增加和减少功能就很方便。
动态代理:
* JVM可以在运行期动态生成出类的字节码,这些动态生成的类往往被用作代理类,即动态代理类
* JVM生成的动态类必须实现一个或多个接口,所以,JVM生成的动态类只能用作具有相同接口的目标类的代理
* CGLIB库可以动态生成一个类的子类,一个类的子类也可以用作该类的代理,所以,如果要为一个没有实现接口的类生成动态代理类,那么就可以使用CGLIB库
* 代理类的各个方法中通常除了要调用目标的相应方法和对外返回目标返回的结果外,还可以在代理方法中的4个位置加上系统功能代码:
1.在调用目标方法之前
2.在调用目标方法之后
3.在调用目标方法前后
4.在处理目标方法异常的catch块中
* 调用代理对象的从Object继承的hashCode(),equals(Object obj),toStirng()这几个方法时,代理对象会将调用请求转发给InvocationHandler对象,对于其它方法,则不转发调用请求,在代理类内部有自己的实现
切面编程就是将切面的代码以对象的方式封装,再传递给执行者,执行者再执行切面对象的方法,就等于执行了切面的代码
让动态生成的类称为目标类的代理:
怎样将目标传进去?
* 直接在InvocationHandler实现类中创建目标类的实例对象,可以看到运行效果和加入日志代码,但没有实际意义
* 为InvacationHandler实现类注入目标类的实例对象,不能采用用匿名内部类的形式了
* 让匿名的InvacationHandler实现类访问外面方法中的目标类实例对象的final类型的引用变量
将创建代理的过程改为一种更优雅的方式,编写一个public Object getProxy(final Object target)方法绑定接收目标同时返回代理对象,让调用者更懒惰,更方便,调用者甚至不用接触任何代理的API
将系统功能代码模块化,即将切面代码也改为通过参数形式提供,怎样把要执行的系统功能代码以参数形式提供呢?
* 把要执行的代码装到一个对象的某个方法里,然后把这个对象作为参数传递,接收者只要调用这个对象的方法,即等于执行了外界提供的代码
* 为public Object getProxy(final Object target)方法增加一个Advice(这个接口中的方法就是封装了系统的功能代码,具体功能由子类实现)参数 ---> public Object getProxy(final Object target, final Advice acvice)
这样,就可以在InvacationHandler的invoke中使用target和Advice来完成新增的系统功能了
黑马程序员_JAVA基础知识总结2