javaFx中AOP实验现象

故事扮演 提交于 2020-02-25 18:33:30

两个切面类都将切点对准同一个函数,即下面的函数,也是一个按钮事件,我的想法就是找出多个切面同时执行(aspect1比aspect2的优先级高)时的顺序及异常时的情况:

public void btnclickOnAction()
    {
        logger.info("HelloworldView ===btnclickOnAction");
        System.out.println("btnclickOnAction.....");
        throw new IllegalArgumentException("自定义的异常消息");
        //当所有的通知都存在的情况下,如果throw一个异常,则console中显示出来的顺序:
        //1:before 2:java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 3:上面btnclickOnAction中显示出来的信息
        //4:after 5:afterThrowing 6:Caused by: java.lang.IllegalArgumentException: 自定义的异常消息

        //当两个切面都作用于同一个切点(两个都没有@around),原方法正常执行,aspectclass比aspectclass2优先级高,显示如下:
//        btnclickOnAction AspectClass@Before running.....
//        btnclickOnAction AspectClass2@Before running.....
//        2020-02-03 16:41:51.375  INFO 3740 --- [lication Thread] c.j.j.controller.HelloController         : HelloworldView ===btnclickOnAction
//        btnclickOnAction.....
//        btnclickOnActionAspectClass2@After running....
//        btnclickOnActionAspectClass2@AfterReturning running....目标方法执行的结果=null
//        btnclickOnActionAspectClass@After running....
//        btnclickOnActionAspectClass@AfterReturning running....目标方法执行的结果=null
        //当两个都还有@around之后,显示如下:
//        btnclickOnActionAspectClass@Around running.... 高优先级@around调用原方法之前
//        btnclickOnAction AspectClass@Before running..... 高优先级的before
//        btnclickOnActionAspectClass2@Around running.... 低优先级的@around调用原方法之前
//        btnclickOnAction AspectClass2@Before running..... 低优先级的before
//        2020-02-03 16:55:28.366  INFO 1580 --- [lication Thread] c.j.j.controller.HelloController         : HelloworldView ===btnclickOnAction
//        btnclickOnAction.....
//        btnclickOnActionAspectClass2@Around running....返回之前=null  低优先级around调用完原有方法准备结束around
//        btnclickOnActionAspectClass2@After running.... 低优先级after
//        btnclickOnActionAspectClass2@AfterReturning running....目标方法执行的结果=null 低优先级aftereturning
//        btnclickOnActionAspectClass@Around running....返回之前=null  高优先级@around调用原方法之后即准备结束高优先级的@around
//        btnclickOnActionAspectClass@After running....高优先级after
//        btnclickOnActionAspectClass@AfterReturning running....目标方法执行的结果=null 高优先级afterreturning
        //还是上面的两个around及其它通知都存在,但目标方法中出现异常:
//        btnclickOnActionAspectClass@Around running....高优先级around调用原方法之前
//        btnclickOnAction AspectClass@Before running.....高优先级before
//        btnclickOnActionAspectClass2@Around running....低优先级around调用原方法之前
//        btnclickOnAction AspectClass2@Before running.....低优先级before
//        2020-02-03 17:03:11.896  INFO 7412 --- [lication Thread] c.j.j.controller.HelloController         : HelloworldView ===btnclickOnAction
//        btnclickOnAction.....    上句和这句是原方法中执行时的部分语句,因为中途出现了异常
//        btnclickOnActionAspectClass2@After running....虽然出现了异常,但低优先级还是会进入after,只不过不会再进入afterretruning了,当然也不会进入around的执行完原方法后的结束部分
//        btnclickOnActionAspectClass2@AfterThrowing running....自定义的异常消息  低优先级进入afterThrowing,表示异常出现了
//        btnclickOnActionAspectClass@After running....低优先级虽然出现了异常,但高优先级还是会进入after,当然,类似低优先级一样,也不会进入高优先级的afterreturning
//        btnclickOnActionAspectClass@AfterThrowing running....自定义的异常消息  低优先级出现了异常,高优先级进入after之后直接进入afterThrowing
        //如果两个都没有@afterThrowing,原方法中出现了异常,则显示如下:
//        btnclickOnActionAspectClass@Around running....
//        btnclickOnAction AspectClass@Before running.....
//        btnclickOnActionAspectClass2@Around running....
//        btnclickOnAction AspectClass2@Before running.....
//        2020-02-03 17:44:28.635  INFO 2716 --- [lication Thread] c.j.j.controller.HelloController         : HelloworldView ===btnclickOnAction
//        btnclickOnAction.....
//        btnclickOnActionAspectClass2@After running.... 低优先级的@around的原方法执行完之后的结束部分也没有执行,只执行After
//        btnclickOnActionAspectClass@After running....
//        。。。。。java.lang.reflect.InvocationTargetException
//        Caused by: java.lang.IllegalArgumentException: 自定义的异常消息
        //上面异常程序,虽然没有@afterThrowing,但程序并没有闪退,即使做成JAR包程序之后执行的时候也是出现异常信息但程序并没有退出
        //难道说 Controller中的异常不会让程序退出吗?我猜想:事件中异常才不会退出,其它地方异常应该退出吧???实验:在构造函数中throw 异常则程序退出
        //由此可以说明,只是在事件中的异常并不会让程序退出


//        JnaDemo jnaDemo = new JnaDemo();
////        jnaDemo.printf("%s", new String[]{"hello jna in bnclick\r\n"}); //它会出现在@After之后才显示,????
//
//        try {
//            jnaDemo.msgfun();
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
//        JavafxSpringbootPomApplication.showView(SecondView.class, Modality.NONE);
    }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!