Skip to content

Commit 7a5ae58

Browse files
authored
Merge pull request #45 from HuolalaTech/dev
Dev
2 parents f5431ef + 60c11cd commit 7a5ae58

39 files changed

+766
-153
lines changed

README_CN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ TheRouter
202202
加入 【TheRouter】 官方微信群:
203203
*如过期,请加微信:kymjs123,拉你进群*
204204

205-
<img src="https://kymjs.com/therouter/wx/therouter_wx.jpg" width="40%" alt="TheRouter官方微信群:https://kymjs.com/therouter/wx" />
205+
<img src="https://therouter.cn/assets/img/therouter_wx_group.png" width="40%" alt="TheRouter官方微信群:https://kymjs.com/therouter/wx" />
206206

207207
### 七、开源协议
208208

app/src/main/java/com/therouter/app/flowtask/TestLifecycle.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ public class TestLifecycle {
1111
*
1212
* @param context application
1313
*/
14-
@FlowTask(taskName = AppFlowTask.TEST_APP1, dependsOn = AppFlowTask.APP_ONCREATE)
14+
@FlowTask(taskName = AppFlowTask.TEST_APP1, dependsOn = AppFlowTask.THEROUTER_INITIALIZATION)
1515
public static void test1(Context context) {
1616
System.out.println("===主应用内=====onApplicationCreate");
1717
}
1818

1919
/**
2020
* 将会在异步执行
2121
*/
22-
@FlowTask(taskName = AppFlowTask.TEST_APP2, dependsOn = AppFlowTask.APP_ONCREATE, async = true)
22+
@FlowTask(taskName = AppFlowTask.TEST_APP2, dependsOn = AppFlowTask.THEROUTER_INITIALIZATION, async = true)
2323
public static void test2(Context context) {
2424
System.out.println("异步===主应用内======Application onCreate后执行");
2525
}

apt/src/main/java/com/therouter/apt/BuildConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.therouter.apt;
22

33
public final class BuildConfig {
4-
public static final String VERSION = "1.1.1";
4+
public static final String VERSION = "1.1.2";
55
public static final String NAME = "apt";
66

77
private BuildConfig() {

apt/src/main/java/com/therouter/apt/ServiceProviderItem.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package com.therouter.apt
22

33
import javax.lang.model.element.Element
44

5-
class ServiceProviderItem : Comparable<ServiceProviderItem> {
5+
class ServiceProviderItem(val isMethod: Boolean) : Comparable<ServiceProviderItem> {
66

77
var element: Element? = null
88

@@ -15,7 +15,7 @@ class ServiceProviderItem : Comparable<ServiceProviderItem> {
1515
var params = ArrayList<String>()
1616

1717
override fun toString(): String {
18-
return "ServiceProviderItem(element=$element, className='$className', returnType='$returnType', methodName='$methodName', params=$params)"
18+
return "ServiceProviderItem(isMethod=$isMethod, element=$element, className='$className', returnType='$returnType', methodName='$methodName', params=$params)"
1919
}
2020

2121
override fun compareTo(other: ServiceProviderItem): Int {

apt/src/main/java/com/therouter/apt/TheRouterAnnotationProcessor.kt

Lines changed: 126 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,8 @@ import java.util.*
1616
import javax.annotation.processing.AbstractProcessor
1717
import javax.annotation.processing.RoundEnvironment
1818
import javax.lang.model.SourceVersion
19-
import javax.lang.model.element.ElementKind
19+
import javax.lang.model.element.*
2020
import javax.lang.model.element.ElementKind.*
21-
import javax.lang.model.element.ExecutableElement
22-
import javax.lang.model.element.Modifier
23-
import javax.lang.model.element.TypeElement
2421
import kotlin.collections.ArrayList
2522
import kotlin.math.abs
2623

@@ -226,56 +223,121 @@ class TheRouterAnnotationProcessor : AbstractProcessor() {
226223
val list: ArrayList<ServiceProviderItem> = ArrayList()
227224
val set = roundEnv.getElementsAnnotatedWith(ServiceProvider::class.java)
228225
for (element in set) {
229-
require(element.kind == METHOD) { element.simpleName.toString() + " is not method" }
230-
var isStatic = false
231-
for (m in element.modifiers) {
232-
if (m == Modifier.STATIC) {
233-
isStatic = true
234-
break
235-
}
226+
val serviceProviderItem = if (element.kind == METHOD) {
227+
handleMethodServiceProviderItem(element)
228+
} else {
229+
handleClassServiceProviderItem(element)
236230
}
237-
require(isStatic) {
238-
(element.enclosingElement.toString()
239-
+ "." + element.simpleName + "() is not static method")
240-
}
241-
val serviceProviderItem = ServiceProviderItem()
242-
serviceProviderItem.element = element
243-
serviceProviderItem.methodName = element.simpleName.toString()
244-
serviceProviderItem.className = element.enclosingElement.toString()
245-
if (element is ExecutableElement) {
246-
serviceProviderItem.returnType = element.returnType.toString()
247-
val parameters = element.parameters
248-
if (parameters.size > 0) {
249-
val params: ArrayList<String> = ArrayList<String>()
250-
repeat(parameters.size) { i ->
251-
params.add(transformNumber(parameters[i].asType().toString()))
231+
list.add(serviceProviderItem)
232+
}
233+
return list
234+
}
235+
236+
private fun handleClassServiceProviderItem(element: Element): ServiceProviderItem {
237+
val serviceProviderItem = ServiceProviderItem(false)
238+
serviceProviderItem.element = element
239+
val annotation = element.getAnnotation(ServiceProvider::class.java)
240+
serviceProviderItem.className = element.toString()
241+
serviceProviderItem.methodName = ""
242+
243+
var toStringStr = annotation.toString()
244+
//过滤最后一个字符')'
245+
toStringStr = toStringStr.substring(0, toStringStr.length - 1)
246+
toStringStr.split(",").forEach { temp ->
247+
if (temp.contains(KEY_RETURNTYPE)) {
248+
val value = handleReturnType(temp.trim())
249+
if (!ServiceProvider::class.java.name.equals(value, ignoreCase = true)) {
250+
serviceProviderItem.returnType = value
251+
}
252+
} else if (temp.contains(KEY_PARAMS)) {
253+
val value = handleParams(temp.trim())
254+
if (value.size > 1) {
255+
serviceProviderItem.params = transform(value)
256+
} else if (value.size == 1) {
257+
if (value[0].trim().isNotEmpty()) {
258+
serviceProviderItem.params = transform(value)
252259
}
253-
serviceProviderItem.params = params
254260
}
255261
}
256-
var toStringStr = element.getAnnotation(ServiceProvider::class.java).toString()
257-
//过滤最后一个字符')'
258-
toStringStr = toStringStr.substring(0, toStringStr.length - 1)
259-
toStringStr.split(",").forEach { temp ->
260-
if (temp.contains(KEY_RETURNTYPE)) {
261-
val value = handleReturnType(temp.trim())
262-
if (!ServiceProvider::class.java.name.equals(value, ignoreCase = true)) {
263-
serviceProviderItem.returnType = value
262+
}
263+
264+
if (serviceProviderItem.returnType.isEmpty()) {
265+
if (element is TypeElement) {
266+
if (element.interfaces.size == 0) {
267+
serviceProviderItem.returnType = serviceProviderItem.className
268+
} else if (element.interfaces.size == 1) {
269+
serviceProviderItem.returnType = element.interfaces[0].toString()
270+
} else {
271+
val prop = Properties()
272+
try {
273+
val gradleProperties = FileInputStream(PROPERTY_FILE)
274+
prop.load(gradleProperties)
275+
} catch (e: Exception) {
276+
e.printStackTrace()
277+
}
278+
if (!STR_TRUE.equals(prop.getProperty(KEY_USE_EXTEND), ignoreCase = true)) {
279+
throw IllegalArgumentException(
280+
element.enclosingElement.toString() + "." + element.simpleName +
281+
" has multiple interfaces. Must to be specified returnType=XXX," +
282+
" or configuration KEY_USE_EXTEND=true in gradle.properties"
283+
)
284+
} else {
285+
serviceProviderItem.returnType = serviceProviderItem.className
264286
}
265-
} else if (temp.contains(KEY_PARAMS)) {
266-
val value = handleParams(temp.trim())
267-
if (value.size > 1) {
287+
}
288+
}
289+
}
290+
return serviceProviderItem
291+
}
292+
293+
private fun handleMethodServiceProviderItem(element: Element): ServiceProviderItem {
294+
var isStatic = false
295+
for (m in element.modifiers) {
296+
if (m == Modifier.STATIC) {
297+
isStatic = true
298+
break
299+
}
300+
}
301+
require(isStatic) {
302+
(element.enclosingElement.toString()
303+
+ "." + element.simpleName + "() is not static method")
304+
}
305+
val serviceProviderItem = ServiceProviderItem(true)
306+
serviceProviderItem.element = element
307+
serviceProviderItem.methodName = element.simpleName.toString()
308+
serviceProviderItem.className = element.enclosingElement.toString()
309+
if (element is ExecutableElement) {
310+
serviceProviderItem.returnType = element.returnType.toString()
311+
val parameters = element.parameters
312+
if (parameters.size > 0) {
313+
val params: ArrayList<String> = ArrayList<String>()
314+
repeat(parameters.size) { i ->
315+
params.add(transformNumber(parameters[i].asType().toString()))
316+
}
317+
serviceProviderItem.params = params
318+
}
319+
}
320+
var toStringStr = element.getAnnotation(ServiceProvider::class.java).toString()
321+
//过滤最后一个字符')'
322+
toStringStr = toStringStr.substring(0, toStringStr.length - 1)
323+
toStringStr.split(",").forEach { temp ->
324+
if (temp.contains(KEY_RETURNTYPE)) {
325+
val value = handleReturnType(temp.trim())
326+
if (!ServiceProvider::class.java.name.equals(value, ignoreCase = true)) {
327+
serviceProviderItem.returnType = value
328+
}
329+
} else if (temp.contains(KEY_PARAMS)) {
330+
val value = handleParams(temp.trim())
331+
if (value.size > 1) {
332+
serviceProviderItem.params = transform(value)
333+
} else if (value.size == 1) {
334+
if (value[0].trim().isNotEmpty()) {
268335
serviceProviderItem.params = transform(value)
269-
} else if (value.size == 1) {
270-
if (value[0].trim().isNotEmpty()) {
271-
serviceProviderItem.params = transform(value)
272-
}
273336
}
274337
}
275338
}
276-
list.add(serviceProviderItem)
277339
}
278-
return list
340+
return serviceProviderItem
279341
}
280342

281343
private fun handleReturnType(str: String): String {
@@ -498,14 +560,26 @@ class TheRouterAnnotationProcessor : AbstractProcessor() {
498560
}
499561
ps.println(") {")
500562
ps.println("\t\t\t// 加上编译期的类型校验,防止方法实际返回类型与注解声明返回类型不匹配")
501-
ps.print(
502-
String.format(
503-
"\t\t\t%s retyrnType = %s.%s(",
504-
serviceProviderItem.returnType,
505-
serviceProviderItem.className,
506-
serviceProviderItem.methodName
563+
564+
if (serviceProviderItem.isMethod) {
565+
ps.print(
566+
String.format(
567+
"\t\t\t%s returnType = %s.%s(",
568+
serviceProviderItem.returnType,
569+
serviceProviderItem.className,
570+
serviceProviderItem.methodName
571+
)
507572
)
508-
)
573+
} else {
574+
ps.print(
575+
String.format(
576+
"\t\t\t%s returnType = new %s(",
577+
serviceProviderItem.returnType,
578+
serviceProviderItem.className
579+
)
580+
)
581+
}
582+
509583
for (count in serviceProviderItem.params.indices) {
510584
if (!serviceProviderItem.params[count].trim { it <= ' ' }.isEmpty()) {
511585
//参数强转
@@ -523,7 +597,7 @@ class TheRouterAnnotationProcessor : AbstractProcessor() {
523597
}
524598
}
525599
ps.println(");")
526-
ps.println("\t\t\tobj = (T) retyrnType;")
600+
ps.println("\t\t\tobj = (T) returnType;")
527601
ps.print("\t\t} else ")
528602
}
529603
ps.println("{\n")

apt/src/main/java/com/therouter/inject/ServiceProvider.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,10 @@ import kotlin.reflect.KClass
88
* Created by ZhangTao on 17/8/11.
99
*/
1010
@Retention(RetentionPolicy.SOURCE)
11-
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
11+
@Target(
12+
AnnotationTarget.FUNCTION,
13+
AnnotationTarget.CLASS,
14+
AnnotationTarget.PROPERTY_GETTER,
15+
AnnotationTarget.PROPERTY_SETTER
16+
)
1217
annotation class ServiceProvider(val returnType: KClass<*> = ServiceProvider::class, val params: Array<KClass<*>> = [])

business-a/src/main/java/com/therouter/demo/TestLifecycle.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public class TestLifecycle {
1717
/**
1818
* 当app3执行以后会被执行
1919
*/
20-
@FlowTask(taskName = BusinessAFlowTask.BIZA_INTERCEPTOR, dependsOn = BusinessAFlowTask.MMKV + "," + BusinessAFlowTask.APP_ONCREATE)
20+
@FlowTask(taskName = BusinessAFlowTask.BIZA_INTERCEPTOR, dependsOn = BusinessAFlowTask.MMKV + "," + BusinessAFlowTask.THEROUTER_INITIALIZATION)
2121
public static void test1(Context context) {
2222
System.out.println("=====来自业务模块====Application.Create,mmkv之后执行");
2323

@@ -49,7 +49,7 @@ public static void test2(Context context) {
4949
System.out.println(Thread.currentThread().getName() + "异步====来自业务模块=====login执行以后");
5050
}
5151

52-
@FlowTask(taskName = BusinessAFlowTask.BIZA_INIT2, dependsOn = BusinessAFlowTask.LOGIN + BusinessAFlowTask.APP_ONCREATE)
52+
@FlowTask(taskName = BusinessAFlowTask.BIZA_INIT2, dependsOn = BusinessAFlowTask.LOGIN + "," + BusinessAFlowTask.THEROUTER_INITIALIZATION)
5353
public static void test3(Context context) {
5454
System.out.println(Thread.currentThread().getName() + "线程=====来自业务模块====");
5555
}

business-a/src/main/java/com/therouter/demo/shell/TestActivity.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import com.therouter.demo.di.IRingReferenceTest;
1616
import com.therouter.demo.di.ITest0;
1717
import com.therouter.demo.di.ITest1;
18+
import com.therouter.demo.di.ITestClassAnnotation;
1819
import com.therouter.inject.RecyclerBin;
1920
import com.therouter.inject.RouterInject;
2021
import com.therouter.router.Route;
@@ -74,5 +75,14 @@ public void onClick(View v) {
7475
textView.append("\n取得对象:" + TheRouter.get(IRingReferenceTest.class));
7576
}
7677
});
78+
final Button button4 = (Button) findViewById(R.id.button4);
79+
button4.setText("测试类注释,直接返回接口");
80+
button4.setOnClickListener(new View.OnClickListener() {
81+
@Override
82+
public void onClick(View v) {
83+
//传入不同的params对象,会得到不同的TheRouter返回值
84+
textView.append("\n取得对象:" + TheRouter.get(ITestClassAnnotation.class));
85+
}
86+
});
7787
}
7888
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.therouter.demo.shell;
2+
3+
import com.therouter.demo.di.ITest0;
4+
import com.therouter.demo.di.ITestClassAnnotation;
5+
import com.therouter.inject.ServiceProvider;
6+
7+
@ServiceProvider(returnType = ITestClassAnnotation.class)
8+
public class TestClassAnnotation implements ITestClassAnnotation, ITest0 {
9+
@Override
10+
public String getMessage() {
11+
return "test";
12+
}
13+
}

business-a/src/main/res/layout/business_a_test.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,11 @@
3636
android:layout_width="match_parent"
3737
android:layout_height="wrap_content"
3838
android:textAllCaps="false" />
39+
40+
<Button
41+
android:id="@+id/button4"
42+
android:layout_width="match_parent"
43+
android:layout_height="wrap_content"
44+
android:textAllCaps="false" />
3945
</LinearLayout>
4046
</ScrollView>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.therouter.demo.di;
2+
3+
public interface ITestClassAnnotation {
4+
}

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,4 @@ android.enableR8=false
2121

2222
baseVersion=1.1
2323
GroupName=com.therouter
24-
TheRouterVersion=1.1.1-rc2
24+
TheRouterVersion=1.1.2-rc7

plugin/src/main/groovy/com/therouter/plugin/BuildConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.therouter.plugin;
22

33
public final class BuildConfig {
4-
public static final String VERSION = "1.1.1";
4+
public static final String VERSION = "1.1.2";
55
public static final String NAME = "plugin";
66

77
private BuildConfig() {

0 commit comments

Comments
 (0)