A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

基础加强
  • 案例-自定义单元测试@MyTest
  • 案例-全局的编码的解决(比装饰器简单)
类加载器类加载器的概述
  • java文件通过编译器生成class字节码文件,然后通过类加载器加载进jvm内存后才能执行
  • class字节码文件通过类加载器加载到内存中会生成字节码对象(Class)(从纯文本文件到字节码对象)
  • 如果要修改一个方法,可以在.java文件中修改,也可以修改内存中的Class对象
类加载器的分类
  • 类加载器有三种,不同类加载器加载不同的
    • BootStrap:引导类加载器:加载都是最基础的文件
    • ExtClassLoader:扩展类加载器:加载都是基础的文件
    • AppClassLoader:应用类加载器:三方jar包和自己编写java文件
  • 怎么获得类加载器?(重点)
    • ClassLoader 字节码对象.getClassLoader();
    • 谁加载的Class对象就获取哪个类加载器
  • 类加载器的作用主要是加载字节码文件的
    • ClassLoader.getResource(String path):获得classes(src)下的任何资源,路径是相对于src,返回的是URI,通过url.getPath()获得文件的绝对路径

注解@xxx什么是注解,注解作用
  • 注解就是符合一定格式的语法 @xxxx
  • 注释:在阅读程序时清楚----给程序员看的
  • 注解:给jvm看的,给机器看的
  • 注解作用:注解在目前而言最主流的应用:代替配置文件
  • 关于配置文件与注解开发的优缺点:
    • 注解优点:开发效率高 成本低
    • 注解缺点:耦合性大 并且不利于后期维护
  • 在开发中,通过配置文件来进行解耦,功能的切换.通过注解修改起来很不方便,不好找
jdk5提供的注解(annotation)
  • @Override:告知编译器此方法是覆盖父类的(给编译器看的)
  • @Deprecated:标注过时
  • @SuppressWarnings:压制警告
  • 注意:
    • 不同的注解只能在不同的位置使用(方法上、字段上、类上)

自定义注解
  • 知道注解底层通过什么方式实现的(在以后开发不会用到自定义注解)
  • 如何去自定义一个注解
    • 关键字:@interface
    • 注解的属性:
      • 语法:返回值 名称();
      • 注意:如果属性的名字是value,并且注解的属性值有一个,那么在使用注解时可以省略value
    • 注解属性类型只能是以下几种
      • 基本类型
      • String
      • 枚举类型
      • 注解类型
      • Class类型
      • 以上类型的一维数组类型


[Java] 纯文本查看 复制代码
@Target({TYPE,METHOD,FILE})//元注解,用来限定自定义的注解可以修饰什么类型的对象
@Retention(SOURCE)//可见范围,控制作用范围是编译器(源码级别,字节码级别,运行时级别),只有设置为RUNTIME级别在运行时才能获取
public @interface MyAnnotation{
    //注解的属性,属性后面要加上(),这是语法规定的
    String name();
    int age() defautl 28;
}


  • 怎么去使用注解
[Java] 纯文本查看 复制代码
@MyAnnotation(name="xxx", age=123)
public void show(){
}


3. 怎么去解析注解------使用反射知识
  • 以后我们使用框架的时候只需要知道怎么使用注解就可以了,不需要我们自己写
  • 解析注解才能给注解添加功能
  • 启动程序的时候字节码文件通过类加载器加载到内存中变成字节码对象
  • 通过字节码对象我们可以会的对应的方法对象,并且可以获得方法对象上的注解

模拟单元测试(自定义单元测试)动态代理
  • 后期Spring用到动态代理
什么是代理
  • 目标对象/被代理对象 ------ 房主:真正的租房的方法
  • 代理对象 ------- 黑中介:有租房子的方法(调用房主的租房的方法)
  • 执行代理对象方法的对象 ---- 租房的人
  • 流程:我们要租房----->中介(租房的方法)------>房主(租房的方法)
  • 抽象:调用对象----->代理对象------>目标对象
  • 代理和目标对象都要有相同的方法,用接口约束,有了目标对象和代理对象同时存在,为静态代理
  • 动态代理-->[动态]:目标对象实实在在存在,代理对象无需实实在在写一个,在运行时在内存中创建的一个虚拟的代理对象
[Java] 纯文本查看 复制代码
Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interface,InvocationHandler h)
//loader:与目标对象相同的类加载器
//interface:接口的字节码对象


使用动态代理完成全局编码
  • web24中filter,之前用装饰器,现在用动态代理
  • 实际开发中方法增强用装饰者模式,动态代理用于拦截




0 个回复

您需要登录后才可以回帖 登录 | 加入黑马