Skip to content

Commit 372908a

Browse files
author
pingxiangdong
committed
3.必做,第一步:尝试将服务端写死查找接口实现类变成泛型和反射;
1 parent bd4db9e commit 372908a

File tree

4 files changed

+22
-96
lines changed

4 files changed

+22
-96
lines changed

07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/RpcfxResolver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22

33
public interface RpcfxResolver {
44

5-
Class<?> resolve(String serviceClass);
5+
<T> T resolve(String serviceClass,Class<T> type);
66

77
}

07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/server/RpcfxInvoker.java

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
package io.kimmking.rpcfx.server;
22

3-
import java.lang.reflect.InvocationTargetException;
4-
import java.lang.reflect.Method;
5-
import java.util.Arrays;
6-
import java.util.Objects;
7-
83
import com.alibaba.fastjson.JSON;
94
import com.alibaba.fastjson.serializer.SerializerFeature;
10-
115
import io.kimmking.rpcfx.api.RpcfxRequest;
126
import io.kimmking.rpcfx.api.RpcfxResolver;
137
import io.kimmking.rpcfx.api.RpcfxResponse;
148

9+
import java.lang.reflect.InvocationTargetException;
10+
import java.lang.reflect.Method;
11+
import java.util.Arrays;
12+
1513
public class RpcfxInvoker {
1614

1715
private RpcfxResolver resolver;
@@ -22,27 +20,20 @@ public RpcfxInvoker(RpcfxResolver resolver){
2220

2321
public RpcfxResponse invoke(RpcfxRequest request) {
2422
RpcfxResponse response = new RpcfxResponse();
25-
26-
//这里肯定是接口类的全路径
2723
String serviceClass = request.getServiceClass();
2824

2925
// 作业1:改成泛型和反射
30-
Class<?> service = resolver.resolve(serviceClass);//this.applicationContext.getBean(serviceClass);
31-
32-
Object serviceInterfaceImpl = null;
26+
Class<?> interfaceClass = null;
3327
try {
34-
serviceInterfaceImpl = service.newInstance();
35-
} catch (InstantiationException | IllegalAccessException e) {
28+
interfaceClass = Class.forName(serviceClass);
29+
} catch (ClassNotFoundException e) {
3630
e.printStackTrace();
3731
}
38-
39-
if (Objects.isNull(serviceInterfaceImpl)) {
40-
throw new RuntimeException("serviceInterfaceImpl is null!");
41-
}
32+
Object service = resolver.resolve(serviceClass, interfaceClass);//this.applicationContext.getBean(serviceClass);
4233

4334
try {
44-
Method method = resolveMethodFromClass(serviceInterfaceImpl.getClass(), request.getMethod());
45-
Object result = method.invoke(serviceInterfaceImpl, request.getParams()); // dubbo, fastjson,
35+
Method method = resolveMethodFromClass(service.getClass(), request.getMethod());
36+
Object result = method.invoke(service, request.getParams()); // dubbo, fastjson,
4637
// 两次json序列化能否合并成一个
4738
response.setResult(JSON.toJSONString(result, SerializerFeature.WriteClassName));
4839
response.setStatus(true);
Lines changed: 9 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,85 +1,20 @@
11
package io.kimmking.rpcfx.demo.provider;
22

3-
import java.io.File;
4-
import java.io.IOException;
5-
import java.net.URL;
6-
import java.util.ArrayList;
7-
import java.util.Enumeration;
8-
import java.util.List;
9-
103
import io.kimmking.rpcfx.api.RpcfxResolver;
4+
import org.springframework.context.ApplicationContext;
5+
import org.springframework.context.ApplicationContextAware;
116

12-
public class DemoResolver implements RpcfxResolver {
7+
public class DemoResolver implements RpcfxResolver, ApplicationContextAware {
138

14-
private final String IMPL_PACKAGE = "io.kimmking.rpcfx.demo.provider";
9+
private ApplicationContext applicationContext;
1510

1611
@Override
17-
public Class<?> resolve(String serviceClass) {
18-
19-
Class<?> interfaceClass = null;
20-
try {
21-
interfaceClass = Class.forName(serviceClass);
22-
} catch (ClassNotFoundException e) {
23-
e.printStackTrace();
24-
}
25-
26-
List<Class<?>> allClasses = getAllClassByPatch(IMPL_PACKAGE);
27-
28-
List<Class<?>> classList = new ArrayList<>();
29-
for (int i = 0; i < allClasses.size(); i++) {
30-
31-
//判断是不是同一个接口
32-
if (interfaceClass.isAssignableFrom(allClasses.get(i))) {
33-
if (!interfaceClass.equals(allClasses.get(i))) {
34-
classList.add(allClasses.get(i));
35-
}
36-
}
37-
}
38-
39-
return classList.get(0);
40-
}
41-
42-
private List<Class<?>> getAllClassByPatch(String implPackage) {
43-
ArrayList<Class<?>> list = new ArrayList<>();
44-
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
45-
String path = implPackage.replace('.', '/');
46-
try {
47-
ArrayList<File> fileList = new ArrayList<>();
48-
Enumeration<URL> enumeration = classLoader.getResources(path);
49-
while (enumeration.hasMoreElements()) {
50-
URL url = enumeration.nextElement();
51-
fileList.add(new File(url.getFile()));
52-
}
53-
for (int i = 0; i < fileList.size(); i++) {
54-
list.addAll(findClass(fileList.get(i),implPackage));
55-
}
56-
} catch (IOException e) {
57-
e.printStackTrace();
58-
}
59-
return list;
12+
public void setApplicationContext(ApplicationContext applicationContext) {
13+
this.applicationContext = applicationContext;
6014
}
6115

62-
private static ArrayList<Class<?>> findClass(File file,String packagename) {
63-
ArrayList<Class<?>> list = new ArrayList<>();
64-
if (!file.exists()) {
65-
return list;
66-
}
67-
File[] files = file.listFiles();
68-
for (File file2 : files) {
69-
if (file2.isDirectory()) {
70-
assert !file2.getName().contains(".");//添加断言用于判断
71-
ArrayList<Class<?>> arrayList = findClass(file2, packagename+"."+file2.getName());
72-
list.addAll(arrayList);
73-
}else if(file2.getName().endsWith(".class")){
74-
try {
75-
//保存的类文件不需要后缀.class
76-
list.add(Class.forName(packagename + '.' + file2.getName().substring(0,
77-
file2.getName().length()-6)));
78-
} catch (ClassNotFoundException e) {
79-
e.printStackTrace();
80-
}
81-
}
82-
}
83-
return list;
16+
@Override
17+
public <T> T resolve(String serviceClass,Class<T> type) {
18+
return this.applicationContext.getBean(serviceClass,type);
8419
}
8520
}

07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/RpcfxServerApplication.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,12 @@ public RpcfxResolver createResolver(){
8787
// annotation
8888

8989

90-
@Bean//(name = "io.kimmking.rpcfx.demo.api.UserService")
90+
@Bean(name = "io.kimmking.rpcfx.demo.api.UserService")
9191
public UserService userService(){
9292
return new UserServiceImpl();
9393
}
9494

95-
@Bean//(name = "io.kimmking.rpcfx.demo.api.OrderService")
95+
@Bean(name = "io.kimmking.rpcfx.demo.api.OrderService")
9696
public OrderService orderService(){
9797
return new OrderServiceImpl();
9898
}

0 commit comments

Comments
 (0)