在学习元编程前,请大家看下下面的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();
- 请实现Aspect接口的getProxy方法?
- 思考能不能同时支持用户设置多个切面?
- 解决完前两个问题的基础上,思考可不可以动态为Order生成接口?