【面试题思考】反射+元编程面试题目(1)
2.2k
等26人参与

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

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生成接口?
我的作业
去发布

登录后即可发布作业,立即

全部作业

数据加载中...

意见反馈 帮助中心 APP下载
官方微信