Skip to content

Commit bc04f41

Browse files
committed
fix #167
1 parent 2b4d311 commit bc04f41

File tree

15 files changed

+576
-432
lines changed

15 files changed

+576
-432
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
<groupId>com.codingapi.springboot</groupId>
1717
<artifactId>springboot-parent</artifactId>
18-
<version>2.10.24</version>
18+
<version>2.10.25</version>
1919

2020
<url>https://github.com/codingapi/springboot-framewrok</url>
2121
<name>springboot-parent</name>

springboot-starter-data-authorization/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<artifactId>springboot-parent</artifactId>
88
<groupId>com.codingapi.springboot</groupId>
9-
<version>2.10.24</version>
9+
<version>2.10.25</version>
1010
</parent>
1111

1212
<name>springboot-starter-data-authorization</name>

springboot-starter-data-fast/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<artifactId>springboot-parent</artifactId>
77
<groupId>com.codingapi.springboot</groupId>
8-
<version>2.10.24</version>
8+
<version>2.10.25</version>
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111

springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/classloader/DynamicEntityClassLoader.java

Lines changed: 0 additions & 60 deletions
This file was deleted.

springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/classloader/DynamicEntityClassLoaderContext.java

Lines changed: 0 additions & 27 deletions
This file was deleted.
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
package com.codingapi.springboot.fast.classloader;
2+
3+
import lombok.Getter;
4+
5+
import java.util.Collection;
6+
import java.util.Map;
7+
import java.util.Set;
8+
import java.util.concurrent.ConcurrentHashMap;
9+
10+
/**
11+
* 动态表的 ClassLoader
12+
*/
13+
public class DynamicTableClassLoader {
14+
15+
@Getter
16+
private final static DynamicTableClassLoader instance = new DynamicTableClassLoader();
17+
18+
private final $DynamicTableClassLoader dynamicTableClassLoader;
19+
20+
private DynamicTableClassLoader() {
21+
dynamicTableClassLoader = new $DynamicTableClassLoader(Thread.currentThread().getContextClassLoader() != null
22+
? Thread.currentThread().getContextClassLoader()
23+
: getClass().getClassLoader());
24+
Thread.currentThread().setContextClassLoader(dynamicTableClassLoader);
25+
}
26+
27+
/**
28+
* 注册类
29+
* @param className name
30+
* @param clazz class
31+
*/
32+
public void registerClass(String className, Class<?> clazz) {
33+
dynamicTableClassLoader.registerClass(className, clazz);
34+
}
35+
36+
/**
37+
* 注册类
38+
* @param clazz class
39+
*/
40+
public void registerClass(Class<?> clazz) {
41+
dynamicTableClassLoader.registerClass(clazz);
42+
}
43+
44+
/**
45+
* 获取类
46+
* @param name className
47+
* @return class
48+
*/
49+
public Class<?> findClass(String name) throws ClassNotFoundException {
50+
return dynamicTableClassLoader.findClass(name);
51+
}
52+
53+
/**
54+
* 加载类
55+
* @param name className
56+
* @param resolve resolve
57+
* @return class
58+
*/
59+
public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
60+
return dynamicTableClassLoader.loadClass(name, resolve);
61+
}
62+
63+
/**
64+
* 清空动态类
65+
* @param name 类名称
66+
*/
67+
public void cleanDynamicClass(String name) {
68+
dynamicTableClassLoader.cleanClass(name);
69+
}
70+
71+
/**
72+
* 获取全部的动态类
73+
*/
74+
public Collection<Class<?>> getDynamicClasses(){
75+
return dynamicTableClassLoader.getDynamicClasses();
76+
}
77+
78+
/**
79+
* 获取全部动态类的名称
80+
*/
81+
public Set<String> getDynamicClassNames(){
82+
return dynamicTableClassLoader.getDynamicClassNames();
83+
}
84+
85+
86+
/**
87+
* $DynamicTableClassLoader
88+
*/
89+
private static class $DynamicTableClassLoader extends ClassLoader {
90+
91+
private final Map<String, Class<?>> dynamicClasses = new ConcurrentHashMap<>();
92+
93+
public $DynamicTableClassLoader(ClassLoader parent) {
94+
super(parent);
95+
}
96+
97+
public void registerClass(String className, Class<?> clazz) {
98+
dynamicClasses.put(className, clazz);
99+
}
100+
101+
public void registerClass(Class<?> clazz) {
102+
this.registerClass(clazz.getName(), clazz);
103+
}
104+
105+
public void cleanClass(String className) {
106+
this.dynamicClasses.remove(className);
107+
}
108+
109+
public Collection<Class<?>> getDynamicClasses(){
110+
return dynamicClasses.values();
111+
}
112+
113+
public Set<String> getDynamicClassNames(){
114+
return dynamicClasses.keySet();
115+
}
116+
117+
118+
@Override
119+
protected Class<?> findClass(String name) throws ClassNotFoundException {
120+
// 首先检查已加载的动态类
121+
if (dynamicClasses.containsKey(name)) {
122+
return dynamicClasses.get(name);
123+
}
124+
// 委托给父类
125+
return super.findClass(name);
126+
}
127+
128+
@Override
129+
public Class<?> loadClass(String name) throws ClassNotFoundException {
130+
return loadClass(name, false);
131+
}
132+
133+
@Override
134+
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
135+
synchronized (getClassLoadingLock(name)) {
136+
// 首先检查是否已经加载
137+
Class<?> c = findLoadedClass(name);
138+
if (c == null) {
139+
// 检查是否是动态类
140+
if (dynamicClasses.containsKey(name)) {
141+
c = dynamicClasses.get(name);
142+
} else {
143+
// 委托给父类
144+
c = super.loadClass(name, resolve);
145+
}
146+
}
147+
148+
if (resolve) {
149+
resolveClass(c);
150+
}
151+
return c;
152+
}
153+
}
154+
155+
}
156+
157+
158+
}

0 commit comments

Comments
 (0)