JDK动态代理

应用#

为每个排序方法计算其运行时间

1
2
3
4
5
6
7
8
9
10
11
// 排序方法接口
public interface SortMethods {
// 冒泡排序
void bubbleSort(int[] arr);
// 选择排序
void selectSort(int[] arr);
// 插入排序
void insertSort(int[] arr);
// 快速排序
void quickSort(int[] arr);
}
1
2
3
4
// 排序方法实现类
public class SortMethodsImpl implements SortMethods {
// 排序方法具体实现见: https://gist.github.com/tiam-bloom/ea2bc5112dfa67506a960a76bdf3c367
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
* @author Tiam
* @date 2023/4/5 22:12
* @description 代理类
*/
public class RunTimeProxy implements InvocationHandler {
private Object target;

public Object bind(Object target) {
this.target = target;
// 返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序。
return Proxy.newProxyInstance(
// 目标类的类加载器
this.target.getClass().getClassLoader(),
// 目标类的接口
this.target.getClass().getInterfaces(),
// 代理类
this);
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.print("执行" + Thread.currentThread().getStackTrace()[2].getMethodName() + "方法");
long start = System.currentTimeMillis();
Object invoke = method.invoke(target, args);
long runTime = System.currentTimeMillis() - start;
System.out.println("总耗时" + runTime + "毫秒");
return invoke;
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// 测试类
public class Test {
public static int[] generateRandomArray(int length, int min, int max) {
if (max - min < 1 || length < 1) {
throw new IllegalArgumentException("参数异常");
}
int[] array = new int[length];
double random;
for (int i = 0; i < length; i++) {
// 范围 [min, max+1)
random = Math.random() * (max + 1 - min) + min;
array[i] = (int) random;
}
return array;
}

public static void main(String[] args) {
RunTimeProxy runTimeProxy = new RunTimeProxy();
SortMethods sortMethodsAndGetRunTime = (SortMethods) runTimeProxy.bind(new SortMethodsImpl());
sortMethodsAndGetRunTime.bubbleSort(generateRandomArray(10000, -100, 100));
sortMethodsAndGetRunTime.insertSort(generateRandomArray(10000, -100, 100));
sortMethodsAndGetRunTime.selectSort(generateRandomArray(10000, -100, 100));
sortMethodsAndGetRunTime.quickSort(generateRandomArray(10000, -100, 100));
/* 运行结果:
执行bubbleSort方法总耗时79毫秒
执行insertSort方法总耗时80毫秒
执行selectSort方法总耗时53毫秒
执行quickSort方法总耗时1毫秒
*/
}
}

可以发现, 快排效率确实很高, 当数组越长时, 差距越明显.