简陋的注解扫描实现
意识流简陋的实现了下注解扫描。 思路: 拿到当前包下所有类文件,反射成类对象, 判断是否包含@Component注解。
@Component注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Component {
}
1
2
3
4
5
2
3
4
5
Main方法
public class Main {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Class<Main> mainClass = Main.class;
//拿到当前类所在的路径
//file:/D:/IdeaProjects/myspring/out/production/myspring/
String s = mainClass.getResource("/").toString();
//拿到当前类所在包名
//com.dram
String packageName = mainClass.getPackage().getName();
String replace = packageName.replace('.', '/');
String path = s + replace;
System.out.println("要扫描的路径 = " + path);
//加载文件
ClassLoader classLoader = mainClass.getClassLoader();
File[] files = new File(path.substring(6)).listFiles();
//存放类文件名
ArrayList<String> classes = new ArrayList<>();
assert files != null;
for (File file : files) {
//把.class结尾的文件名放到classes
if (file.getName().endsWith(".class")) {
if (file.getName().equals(Main.class.getSimpleName() + ".class")) {
continue;
}
classes.add(file.getName());
}
}
//存放类对象
ArrayList<Class> classArrayList = new ArrayList<>();
//遍历文件名
for (String aClass : classes) {
//拼接成完整包名,加载成类对象
String s1 = aClass.split("\\.")[0];
classArrayList.add(Class.forName(packageName + "." + s1, false, classLoader));
}
System.out.println("所有的类对象" + classArrayList);
//存放所有带有component注解的类对象
ArrayList<Class> componentClasses = new ArrayList<>();
//遍历加载好的类对象
for (Class aClass : classArrayList) {
//拿到单个类的注解集合
Annotation[] annotations = aClass.getAnnotations();
if (annotations.length == 0) {
//没有注解
continue;
} else {
//遍历注解集合
for (Annotation annotation : annotations) {
//判断单个注解是否是我们定义的Component注解
Class<? extends Annotation> x = annotation.annotationType();
if (x.equals(Component.class)) {
componentClasses.add(aClass);
}
}
}
}
System.out.println("包含Component注解的类:" + componentClasses);
//TODO 把对象实例化到IOC容器中
}
}
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
运行结果:
要扫描的路径 = file:/D:/IdeaProjects/myspring/out/production/myspring/com/dram 所有的类对象[interface com.dram.Component, class com.dram.UserController, class com.dram.UserService] 包含Component注解的类:[class com.dram.UserController, class com.dram.UserService]
上次更新: 10/23/2024