动态代理,注解,

  动态代理

定义

代理:本来应该自己做的事情,请了别人来做,被请的人就是代理对象

动态代理:在程序运行过程中产生的这个对象,而程序运行过程中产生对象其实

就是我们刚才反射讲解的内容,所以,动态代理其实就是通过反射来生成一个代理对象。

java中动态代理的使用

在Java中java.lang.reflect包下提供了一个Proxy类和一个 接口,通过使用这个类和接口就可以生成动态代理对象

public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)

最终会调用InvocationHandler的方法

InvocationHandler Object invoke(Object proxy,Method method,Object[] args)

演示

publicstaticvoidmain(String[]args)throwsException{


    Studentstudent=newStudent();

    //创建Student的代理对象

    MyInterfacep=(MyInterface)Proxy.newProxyInstance(Student.class.getClassLoader(),Student.class.getInterfaces(),newInvocationHandler() {


        @Override

        publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{

            System.out.println("你好");

            method.invoke(student);

            returnnull;

        }

    });

    p.method();

}

原理

利用对象的类的字节码接口,写出一个新的类到本地区,通过编译器直接编译成.class文件,再通过类加载器加载进来

弊端: 代理的对象必须实现接口

cglib

定义

非java原生的动态代理, 效率更高,限制更小

可以代理没有接口的类

使用

导包

演示

publicstaticvoidmain(String[]args) {

    //导入包  cglib-core  asm    ant    ant-launcher

    //创建运行器

    MethodInterceptormi=newMethodInterceptor() {


        @Override

        publicObjectintercept(Objectarg0,Methodarg1,Object[]arg2,MethodProxyarg3)throwsThrowable{

            System.out.println("运行前");

            arg3.invokeSuper(arg0,arg2);

            System.out.println("运行后");

            returnnull;

        }

    };

    //获取代理类

    Enhancerenhancer=newEnhancer();

    //设置父类

    enhancer.setSuperclass(Demo.class);

    //运行任务

    enhancer.setCallback(mi);

    //创建代理对象

    Demod=(Demo)enhancer.create();

    d.method();

}

总结

单例模式

模式: 针对某种问题的最优解

懒汉式, 饿汉式 , 饿汉式的变形体

如何写单例模式

私有化构造方法

提供自己创建的对象给使用者

优点 :

节省内存空间,  提升访问的速度

缺点 :

相对于静态来说, 效率还是要低一些

枚举

枚举就是多例的简写形式

枚举项的权限, 修饰符, 类型, new 省略

枚举的注意事项

类加载

就是将.class文件从硬盘上读取到内存中,变成一个java可以使用的类

类加载器

四个类加载器和他们的应用范围

根类加载器不是java代码写的

双亲委派模型

加载一个类的时候,从最底层的类加载器开始逐层上传, 一直到顶层, 整个过程要检测这个类有没有被加载过

作用 : 保持类的唯一性

反射

反射其实就是java提供的另外一种编程模式

提高了代码的兼容性, 扩展性

反射操作构造方法, 操作成员变量, 操作成员方法

 default关键字

定义

1.8中允许我们给接口添加一个非抽象的方法实现, 在方法使用default关键字就可以了,这个特征又叫做拓展方法

演示

publicinterfaceMyInterface{

    //使用default的关键字

    publicdefaultvoidmethod(){

        System.out.println("你好....");

    }

}

注意事项

我们都知道, java之所以支持多实现就是应为接口中没有具体的逻辑代码, 不会造成冲突的问题, 那么1.8之后我们可以在接口中编写具体的逻辑代码了,那么多实现的时候会冲突吗 ?

肯定会冲突的,所以为了解决这个问题, 编译器要求如果多实现的时候出现了相同名称的非抽象方法的话,子类就必须重写这个方法

多实现

publicclassDemoimplementsMyInterface,MyInterface2{

    @Override

    publicvoidmethod() {

        System.out.println("子类必须重写多个接口中相同名称的非抽象方法");

MyInterface.super.method();

    }

}

二. 接口中的静态方法

定义

在接口中定义一个静态的方法, 可以有具体的代码实现

演示

publicinterfaceMyInterface{


    //静态方法 只能接口自己使用

    //接口中的静态方法权限必须是public的, 默认加上public

    staticvoidmethod3(){

        System.out.println("我是接口中的静态方法");

    }

}

注意事项

子类无法使用接口中的静态方法

接口中的静态方法的权限必须是公共的,可以不写,默认是公共的

lambda表达式

定义

一种简写形式,格式精简, 很酷

每一个lambda的表达都对应一个类型,通常是接口类型的

适用于函数式接口(只有一个抽象方法的接口)

格式

(参数...) -> {执行代码} 返回一个可用的对象

当只有一句代码时,大括号可以省略, 建议省略

演示

publicstaticvoidmain(String[]args) {

    List<String>list=Arrays.asList("hh","dd","ni","kk");


    //之前的写法

    Collections.sort(list,newComparator<String>() {

        publicintcompare(Stringo1,Stringo2) {


            returno1.compareTo(o2);

        }

    });


    //lambda表达式的写法

    Collections.sort(list, (Stringa,Stringb)->{

        returna.compareTo(b);

    });


    System.out.println(list);

}

方法的引用

使用 : : 来引用一个类的方法

publicinterfaceDoing<K,T>{


    publicTdoing(Kk);

}

publicstaticvoidmain(String[]args) {

    //调用类中的静态方法来处理接口中方法上的参数

    Doing<String,Integer>d=Integer::valueOf;

    Integerinteger=d.doing("123");

    System.out.println(integer);

}

publicstaticvoidmain(String[]args) {

    //调用对象的方法

    Doing<String,Integer>d="java"::lastIndexOf;

    Integeri=d.doing("v");

    System.out.println(i);

}

构造方法的引用

用new关键字来代替构造方法

publicclassPerson{

    Stringname;

    Person(Stringname) {

        super();

        this.name=name;

    }

    @Override

    publicStringtoString() {

        return"Person [name="+name+"]";

    }

}

publicstaticvoidmain(String[]args) {

    //引用对象的构造方法

    Doing<String,Person>d=Person::new;

    Personperson=d.doing("小明");


    System.out.println(person);

}

注意事项

lambda表达式指向的接口必须和调用的方法的参数一致,也就是说相当于是接口实现类中的方法调用你指向的方法

lambda表达式中访问外层作用域和老版本的匿名对象的方式很相似, 你可以直接访问标记了final的外层局部变量, 或者示例的字段以及静态变量

lambda表达式中无法访问接口中的默认方法(就是被default修饰的方法)

四. Stream接口

定义

表示能应用在一组元素上一次执行的操作序列

其实就是找了一个地方将执行了某个方法后剩下的元素存放起来

提供了许多操作集合的方法,而且原集合数据不受影响

常用的方法

filter    过滤

sorted    排序

map    转化

match  匹配

count  计数

演示

publicstaticvoidmain(String[]args) {

    List<String>stringCollection=newArrayList<>();

    stringCollection.add("ddd2");

    stringCollection.add("aaa2");

    stringCollection.add("bbb1");

    stringCollection.add("aaa1");

    stringCollection.add("bbb3");

    stringCollection.add("ccc");

    stringCollection.add("bbb2");

    stringCollection.add("ddd1");


    //过滤出以a开头的元素并遍历

    stringCollection.stream().

    filter((s)->s.startsWith("a"))

    .forEach(System.out::println);;

}

并行

并行Stream可以在多个线程上同时执行

publicstaticvoidmain(String[]args) {

    intmax=1000000;

    List<String>values=newArrayList<>(max);

    for(inti=0;i<max;i++) {

        //创建随机id

    UUIDuuid=UUID.randomUUID();

    values.add(uuid.toString());

    }


    longt1=System.nanoTime();

    //获取并行的stream

    longcount=values.parallelStream().sorted().count();

    System.out.println(count);


    longt2=System.nanoTime();

    System.out.println(t2-t1);

}

五. Date

定义

java 8 在包java.time下包含了一组全新的时间日期API

ZoneId

定义时区

publicstaticvoidmain(String[]args) {

    System.out.println(ZoneId.getAvailableZoneIds());

    //获取某个城市的时区

    ZoneIdzone1=ZoneId.of("Europe/Berlin");

    ZoneIdzone2=ZoneId.of("Asia/Shanghai");

    System.out.println(zone1.getRules());

    System.out.println(zone2.getRules());

}

LocalTime

一个没有时区信息的时间,以设置的时区为准备

publicstaticvoidmain(String[]args) {

    //获取所有的时区信息

    System.out.println(ZoneId.getAvailableZoneIds());

    //获取某个城市的时区

    ZoneIdzone1=ZoneId.of("Europe/Berlin");

    ZoneIdzone2=ZoneId.of("Asia/Shanghai");


    LocalTimenow1=LocalTime.now(zone1);

    LocalTimenow2=LocalTime.now(zone2);

    //判断时间1以是否在时间2之前

    System.out.println(now1.isBefore(now2));// true

    //使用ChronoUnit计算两个时间差值

    longhoursBetween=ChronoUnit.HOURS.between(now1,now2);

    longminutesBetween=ChronoUnit.MINUTES.between(now1,now2);

    System.out.println(hoursBetween);

    System.out.println(minutesBetween);

}

六.其他新特性

重复注解

可以将参数的名字保留到字节码中

Nashorn引擎 : jjs , 可以执行js代码

移除了FermGen空间,用Metaspace代替

-XX:MetaSpaceSize与-XX:MaxMetaspaceSize被代替-XX:PermSize与-XX:MaxPermSize

一阶段的知识点

了解计算机基础知识

了解的dos命令

了解java的历史

jdk的安装和环境变量的配置

进制

java的编译-运行方式

变量, 常量  数据类型(基本的8个,引用的5个)

运算符  :  算数运算符  复制运算符 关系运算符  逻辑运算符(双与双或/单与单或)  位运算符(& | ~  >> <<  >>>)    三元运算符

判断 循环

数组 (长度固定) 二维数组

方法  (方法的组成, 重载: 方法名相同,参数列表不同)

面向对象

如何写一个类

如何使用一个类

类和类之间的关系(重写)

抽象类和接口

多态 : 提高扩展性和兼容性

内部类 :  成员的, 静态的, 局部的, 匿名的

异常 : 最重要的时类名

常用类

Object

String (方法必须记熟)

StringBuffer  StringBuilder

Math Date SimpleDateFormat

Random  BigInteger  BigDcimal

集合

Collection Map

List Set Queue

List :

ArrayList: 查改快 增删慢  LInkedList: 增删快, 查改慢

Set

HashSet : 去重    TreeSet : 去重 排序

Map (key不能重复)

HashMap :  快    TreeMap : 排序

Collections

迭代器  迭代器运行时不能改变原集合

泛型 :

多线程

多线程的好处

多线程的创建使用

多线程的状态

线程的通信

线程池

File 类

操作本地路径(文件和文件夹)

递归

字节流 字符流 

文件流中, 除了FileInputStream和FileOutputStream之外, 其他的都是缓冲流

缓冲流有缓冲区, 使用时要注意

网络编程

ip 端口号

UDP TCP

java 两种网络编程方式(主要记TCP)

NIO

非阻塞  模拟多线程, 没有多线程的开销, 实质还是轮询处理, 只适合小流量高并发的场景

通道管理器

单例 多例  枚举 类加载器  反射  多态代理  注解   

1 . 8 新特性 :    接口中 default static的使用    la

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342