pursue wind pursue wind
首页
Java
Python
数据库
框架
Linux
中间件
前端
计算机基础
DevOps
项目
面试
书
关于
归档
MacOS🤣 (opens new window)
GitHub (opens new window)
首页
Java
Python
数据库
框架
Linux
中间件
前端
计算机基础
DevOps
项目
面试
书
关于
归档
MacOS🤣 (opens new window)
GitHub (opens new window)
  • 技术面试题篇

  • 面试准备篇

  • 技术面试题自测篇

  • 练级攻略篇

  • 工作篇

  • 面经篇

  • 笑傲Java面试

    • 2-1 导学-Java编程技巧部分
    • 2-2 IDEA Java配置补充
    • 2-4 Java8 Stream 接口:流和并发计算实例
    • 2-5 和面试官聊聊实现管道和流计算的基石:函数式的Monad
    • 2-6 Buffer的原理和使用场景+面试题解读
    • 2-7 补充提问:同步和阻塞、异步和非阻塞等不等价?
    • 2-8 阿里面试题:中文乱码处理和大文件计算词频
    • 2-9 实战场景Coding训练:解读反射+代理+AOP 并结合业务逻辑实现
    • 2-10 注解部分答案
    • 2-11 反射-元编程面试题目合集
      • 2-12 面试必备:Java8-11的新特性和理解的误区
      • 2-13 白板篇-Java编程总结(以及面试题)
      • 3-1 算法和数据结构导学
      • 3-2 教你面试时不会忘记的5种手写排序
      • 3-3 手写链表算法
      • 3-4 手写栈和队列面试专项
      • 3-5 课后习题+面试题:用栈和队列实现表达式解析
      • 3-6 迷宫伪代码和8皇后问题源代码
      • 3-7 3-7 树部分源代码
      • 3-8 8皇后问题
      • 3-10 动态规划的课前题目
      • 3-11 总结和课后习题:白板篇-数据结构和算法
      • 4-1 解读:并发编程知识体系
      • 4-2 看看你的基础:Java线程状态之间如何转换?
      • 4-3 CAS和原子操作
      • 4-4 同步器(上篇)——面试官问synchronized本质是什么?
      • 4-5 同步器(中)——AbstractQueuedSynchronizer
      • 4-6 面试官:说6个Java的同步器?
      • 4-7 面试官出难题:并发环境下单例怎么写性能最高
      • 4-8 面试官:LinkedBlockingDeque和SynchronousQueue工作原理一样吗?
      • 4-9 面试要点:volatile的简短补充
      • 4-10 给面试官讲讲无锁编程(Lock-Free Programming)
      • 4-11 高阶并发编程Coding训练:N种优化哲学家就餐问题的方法
      • 4-12 并发基础篇:总结和思考题
      • 4-13 并发部分的通关Boss: 生成、发放大量红包并控制资金流速
    • LeetCode

    • 面试
    • 笑傲Java面试
    pursuewind
    2021-12-13
    目录

    2-11 反射-元编程面试题目合集

    # 反射-元编程面试题目合集

    在学习元编程前,请大家看下下面的3道面试题目,看下自己是否可以顺利解答,然后再到视频课程中寻找答案。

    tips: 讲项目的方式,是为了判断你在项目中投入了多少思考。从而判断求职者在团队中扮演什么角色。对项目了解程度越深,就说明求职者在团队中越重要。讲项目判断不出技术实力,看实力得看具体对问题的设计能力,并且Coding出来,而直接考察算法,对人才的判断又太过武断。像下面这两道结合架构和程序设计一起考察,而且可以coding出来的方式,其实是一个很好的考察方式。

    # 题目1: 通过反射实现面向切面编程(AOP)

    你开发的核心订单服务,有一个支付方法,现在要为这个支付方法增加统计执行时间的切面。代码如下,代码中用Thread.sleep来模拟pay方法是需要一个耗费时间的方法。

    public interface IOrder {
    
        void pay() throws InterruptedException;
    
        void show();
    }
    
    
    public class Order implements IOrder{
    
        int state = 0;
        @Override
        public void pay() throws InterruptedException {
            Thread.sleep(50); // 模拟需要耗费时间
            this.state = 1;
        }
    
        @Override
        public void show() {
    
            System.out.println("order status:" + this.state);
        }
    
    }
    

    现在我们要统计pay方法的用时,我们不希望在pay的逻辑中增加(增加系统的复杂度),而是利用切面编程实现一个微型的切面框架去做:

    public interface Aspect {
        void before();
        void after();
        // getProxy
        
    }
     
    public class TimeUsageAspect implements Aspect {
    
        long start;
    
        @Override
        public void before() {
            start = System.currentTimeMillis();
        }
    
        @Override
        public void after() {
            var usage = System.currentTimeMillis() - start;
            System.out.format("time usage : %dms\n", usage);
    
        }
    }
    

    请实现这个面向切面的微型框架,在使用程序的时候,我们会这样使用:

    (注:支持传入切面类的名字是为了练习反射)

    IOrder order = Aspect.getProxy(Order.class, "coding.proxy.TimeUsageAspect");
    order.pay();
    order.show();
    
    1. 请实现Aspect接口的getProxy方法?
    2. 思考能不能同时支持用户设置多个切面?
    3. 解决完前两个问题的基础上,思考可不可以动态为Order生成接口?

    # 题目2: 改写上面的程序,用注解去实现应该如何做?

    上面的程序用了面向切面编程,但是使用起来不是非常的方便,特别是Aspect.getProxy方法使用起来有点繁琐,请问有没有更好的方法?

    类似下面这样的方式:

    @Aspect(TimeUsageAspect)
    public class Order {
        //...
    }
    

    请问代码应该如何实现?

    Last Updated: 2023/01/30, 11:01:00
    2-10 注解部分答案
    2-12 面试必备:Java8-11的新特性和理解的误区

    ← 2-10 注解部分答案 2-12 面试必备:Java8-11的新特性和理解的误区→

    Theme by Vdoing | Copyright © 2019-2023 pursue-wind | 粤ICP备2022093130号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式
    • 飙升榜
    • 新歌榜
    • 云音乐民谣榜
    • 美国Billboard榜
    • UK排行榜周榜
    • 网络DJ