Skip to content

Commit 2169ead

Browse files
committed
调整EasyReflect与EasyFormatter逻辑
1 parent 0b023b3 commit 2169ead

File tree

6 files changed

+193
-68
lines changed

6 files changed

+193
-68
lines changed

README.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ val result2:String = any.easyFormat()// 或者使用扩展函数。直接格式
5252
- [EasyLog](./docs/EasyLog.md)
5353
> 用于简单的进行日志打印输出,支持格式化输出、自定义打印格式。
5454
55+
- 支持在任意线程调用使用
56+
5557
用法示例:
5658
```
5759
val any:Any = create()// 创建待打印数据
@@ -73,12 +75,12 @@ EasyToast.create(layoutID:Int, tvID:Int, duration:Int).show(message)// 使用自
7375
用法示例:
7476
```
7577
// 以类名Test为例
76-
class Test(val name:String) {
77-
fun wrap(name:String):String = "包裹后的数据$name"
78+
class Test private constructor(private val name:String) {
79+
private fun wrap(name:String):String = "包裹后的数据$name"
7880
}
7981
8082
// 创建Reflect实例:
81-
var reflect = EasyReflect.create(Test())
83+
var reflect = EasyReflect.create(Test::class.java).instance("默认参数")
8284
8385
// 为name字段赋值:
8486
reflect.setField("name", "EasyReflect")

app/build.gradle

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ android {
2121
}
2222
}
2323

24-
def useLocal = true
25-
2624
def butterknife_version='8.8.1'
2725
dependencies {
2826
implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
@@ -33,9 +31,7 @@ dependencies {
3331

3432
implementation "com.jakewharton:butterknife:$butterknife_version"
3533
kapt "com.jakewharton:butterknife-compiler:$butterknife_version"
36-
if (useLocal) {
37-
implementation project(':utils')
38-
} else {
39-
implementation 'com.github.yjfnypeu:EasyAndroid:1.0.1'
40-
}
34+
35+
implementation project(':utils')
36+
// implementation 'com.github.yjfnypeu:EasyAndroid:1.0.2'
4137
}
Lines changed: 99 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,86 +1,141 @@
11
package com.haoge.sample.easyandroid.activities
22

3+
import android.annotation.SuppressLint
34
import android.os.Bundle
45
import butterknife.OnClick
6+
import com.haoge.easyandroid.easy.EasyLog
57
import com.haoge.easyandroid.easy.EasyReflect
8+
import com.haoge.easyandroid.easyFormat
69
import com.haoge.sample.easyandroid.BaseActivity
710
import com.haoge.sample.easyandroid.R
811

912
/**
1013
* @author haoge on 2018/5/22
1114
*/
15+
@SuppressLint("SetTextI18n")
1216
class EasyReflectActivity:BaseActivity() {
1317

18+
val log = EasyLog.DEFAULT
19+
1420
override fun onCreate(savedInstanceState: Bundle?) {
1521
super.onCreate(savedInstanceState)
1622
setContentView(R.layout.activity_reflect)
1723
}
1824

19-
@OnClick(R.id.createTypes)
20-
fun createTypes() {
21-
println("第一种:只通过对应的class进行创建。")
22-
println(EasyReflect.create(Test::class.java))
23-
println("第二种:通过具体的实例进行创建。")
24-
println(EasyReflect.create(Test()))
25-
println("第三种:通过完整类名进行创建")
26-
println(EasyReflect.create("com.haoge.sample.easyandroid.activities.Test"))
27-
println("第四种:先通过对应class创建后再进行实例化")
28-
println(EasyReflect.create(Test::class.java).instance("构造函数第一个参数"))
25+
@OnClick(R.id.createWithInstance)
26+
fun createWithInstance() {
27+
val reflect = EasyReflect.create(Test())
28+
log.d("直接使用具体实例进行创建:\n$reflect")
2929
}
3030

31-
@OnClick(R.id.fieldReflect)
32-
fun fieldReflect() {
33-
val reflect = EasyReflect.create(Test())
31+
@OnClick(R.id.createWithClass)
32+
fun createWithClass() {
33+
val reflect = EasyReflect.create(Test::class.java)
34+
log.d("只使用class进行创建:\n$reflect")
35+
}
36+
37+
@OnClick(R.id.createWithClassName)
38+
fun createWithClassName() {
39+
val reflect = EasyReflect.create("com.haoge.sample.easyandroid.activities.Test")
40+
log.d("只使用class类全名进行创建:\n$reflect")
41+
}
42+
43+
@OnClick(R.id.createByConstructor)
44+
fun createByConstructor() {
45+
val reflect = EasyReflect.create(Test::class.java).instance("自定义参数")
46+
log.d("使用class与构造参数进行创建:\n$reflect")
47+
}
3448

35-
println("直接使用EasyReflect进行数据操作")
36-
println(reflect.setField("name", "直接通过EasyReflect进行重置"))
49+
@OnClick(R.id.getInstanceValue)
50+
fun getInstanceValue() {
51+
val reflect = EasyReflect.create(Test::class.java).instance("构造函数")
52+
log.d("获取创建出来的实例:${reflect.get<Test>()}")
53+
}
3754

38-
println("直接使用EasyReflect获取变量数据")
39-
println("获取的变量数据为:${reflect.getFieldValue<String>("name")}")
55+
@OnClick(R.id.getFieldValueByNameWithReflect)
56+
fun getFieldValueByNameWithReflect() {
57+
val reflect = EasyReflect.create(Test::class.java)
58+
log.e("通过创建出的reflect:\n$reflect \n获取到字段name的值为:${reflect.getFieldValue<String>("name")}")
59+
}
4060

41-
val field = reflect.getField("name")
42-
println("name字段类型是:${field.field.type}")
43-
println("name字段值是:${field.getValue<String>()}")
44-
field.setValue("重置名字")
45-
println("重置后的字段值是:${field.getValue<String>()}")
61+
@OnClick(R.id.setFieldValueByNameWithReflect)
62+
fun setFieldValueByNameWithReflect() {
63+
val reflect = EasyReflect.create(Test::class.java)
64+
log.e("字段被设置之前的reflect: \n$reflect")
65+
reflect.setField("name", "故意设置的")
66+
log.e("字段被设置之后的reflect: \n$reflect")
67+
}
4668

47-
println("测试无具体实例时。调用静态变量")
48-
println("静态变量值为:${EasyReflect.create(Test::class.java).getFieldValue<String>("staticValue")}")
69+
@OnClick(R.id.callMethodWithReflect)
70+
fun callMethodWithReflect() {
71+
val reflect = EasyReflect.create(Test())
72+
reflect.call("invoked", "invoke param")
4973
}
5074

51-
@OnClick(R.id.methodReflect)
52-
fun methodReflect(){
75+
@OnClick(R.id.callMethodWithReturnReflect)
76+
fun callMethodWithReturnReflect() {
5377
val reflect = EasyReflect.create(Test())
54-
println("使用EasyReflect执行方法:")
55-
reflect.call("toString")
56-
println("使用EasyReflect执行方法并获取返回数据")
57-
println(reflect.callWithReturn("toString"))
58-
val method = reflect.getMethod("toString")
59-
println("使用MethodReflect执行方法")
60-
method.call()
61-
println("使用MethodReflect执行方法并获取返回数据")
62-
println(method.callWithReturn())
63-
64-
println("测试无具体实例时。调用静态方法")
65-
EasyReflect.create(Test::class.java).call("print", "这是传入参数")
78+
log.d("调用方法前的reflect: \n$reflect")
79+
val newReflect = reflect.callWithReturn("invoked", "invoke")
80+
log.d("调用方法之后的reflect: \n$newReflect")
81+
}
82+
83+
@OnClick(R.id.getFieldsWithReflect)
84+
fun getFieldsWithReflect() {
85+
val reflect = EasyReflect.create(Test::class.java)
86+
log.d("Test类所有字段:\n${reflect.getFields().easyFormat()}")
87+
}
88+
89+
@OnClick(R.id.getMethodsWithReflect)
90+
fun getMethodsWithReflect() {
91+
val reflect = EasyReflect.create(Test::class.java)
92+
log.d("Test类所有方法:\n${reflect.getMethods().easyFormat()}")
93+
}
94+
95+
@OnClick(R.id.getConstructorsWithReflect)
96+
fun getConstructorsWithReflect() {
97+
val reflect = EasyReflect.create(Test::class.java)
98+
log.d("Test类所有构造函数:\n${reflect.getConstructors().easyFormat()}")
99+
}
100+
101+
@OnClick(R.id.callStaticMethod)
102+
fun callStaticMethod() {
103+
val reflect = EasyReflect.create(Test::class.java)
104+
reflect.call("print", "自定义参数")
105+
}
106+
107+
@OnClick(R.id.getStaticField)
108+
fun getStaticField() {
109+
val reflect = EasyReflect.create(Test::class.java)
110+
val field = reflect.getField("staticValue")
111+
log.d("获取到的字段为:\n${field.easyFormat()} \n 值为:${field.getValue<String>()}")
66112
}
67113
}
68114

69-
class Test(val name:String){
115+
// 用于进行测试的类
116+
class Test private constructor(private val name:String){
70117
constructor():this("默认名字")
71118

72119
override fun toString(): String {
73-
println("toString方法被调用")
74120
return "Test(name='$name')"
75121
}
76122

123+
fun invoked(name:String){
124+
EasyLog.DEFAULT.e("Test的invoked方法被执行。参数为$name")
125+
}
126+
77127
companion object {
78128
@JvmStatic
79-
fun print(message:String) {
80-
println("静态方法被调用,传入参数:$message")
129+
private fun print(message:String) {
130+
EasyLog.DEFAULT.e("静态方法被调用,传入参数:$message")
81131
}
82132

83-
var staticValue = "静态文本"
133+
@JvmStatic
134+
private var staticValue = "静态文本"
84135
}
85136

86-
}
137+
}
138+
139+
data class A(var b:B?)
140+
141+
data class B(var a:A?)

app/src/main/res/layout/activity_reflect.xml

Lines changed: 78 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,93 @@
88
android:layout_width="match_parent"
99
android:layout_height="wrap_content">
1010

11+
<TextView
12+
android:text="此页面点击效果请结合logcat进行查看"
13+
android:padding="10dp"
14+
android:layout_width="match_parent"
15+
android:layout_height="wrap_content" />
16+
17+
<Button
18+
android:id="@+id/createWithInstance"
19+
android:text="直接使用具体实例进行创建"
20+
android:layout_width="match_parent"
21+
android:layout_height="wrap_content" />
22+
23+
<Button
24+
android:id="@+id/createWithClass"
25+
android:text="直接使用Class进行创建"
26+
android:layout_width="match_parent"
27+
android:layout_height="wrap_content" />
28+
29+
<Button
30+
android:id="@+id/createWithClassName"
31+
android:text="使用className进行创建"
32+
android:layout_width="match_parent"
33+
android:layout_height="wrap_content" />
34+
35+
<Button
36+
android:id="@+id/createByConstructor"
37+
android:text="使用指定构造函数进行创建"
38+
android:layout_width="match_parent"
39+
android:layout_height="wrap_content" />
40+
41+
<Button
42+
android:id="@+id/getInstanceValue"
43+
android:text="获取创建出来的对象实例"
44+
android:layout_width="match_parent"
45+
android:layout_height="wrap_content" />
46+
47+
<Button
48+
android:id="@+id/getFieldValueByNameWithReflect"
49+
android:text="获取指定的成员变量的值"
50+
android:layout_width="match_parent"
51+
android:layout_height="wrap_content" />
52+
53+
<Button
54+
android:id="@+id/setFieldValueByNameWithReflect"
55+
android:text="为指定成员变量赋值"
56+
android:layout_width="match_parent"
57+
android:layout_height="wrap_content" />
58+
59+
<Button
60+
android:id="@+id/callMethodWithReflect"
61+
android:text="指定调用指定方法"
62+
android:layout_width="match_parent"
63+
android:layout_height="wrap_content" />
64+
65+
<Button
66+
android:id="@+id/callMethodWithReturnReflect"
67+
android:text="调用方法并根据返回值创建新EasyReflect对象返回"
68+
android:layout_width="match_parent"
69+
android:layout_height="wrap_content" />
70+
71+
<Button
72+
android:id="@+id/getFieldsWithReflect"
73+
android:text="获取所有的字段"
74+
android:layout_width="match_parent"
75+
android:layout_height="wrap_content" />
76+
77+
<Button
78+
android:id="@+id/getMethodsWithReflect"
79+
android:text="获取所有的方法"
80+
android:layout_width="match_parent"
81+
android:layout_height="wrap_content" />
82+
1183
<Button
12-
android:id="@+id/createTypes"
13-
android:text="EasyReflect实例创建的几种方式"
84+
android:id="@+id/getConstructorsWithReflect"
85+
android:text="获取所有的构造函数"
1486
android:layout_width="match_parent"
1587
android:layout_height="wrap_content" />
1688

1789
<Button
18-
android:id="@+id/fieldReflect"
19-
android:text="成员变量反射操作"
90+
android:id="@+id/callStaticMethod"
91+
android:text="调用静态方法"
2092
android:layout_width="match_parent"
2193
android:layout_height="wrap_content" />
2294

2395
<Button
24-
android:id="@+id/methodReflect"
25-
android:text="成员方法反射操作"
96+
android:id="@+id/getStaticField"
97+
android:text="访问静态变量"
2698
android:layout_width="match_parent"
2799
android:layout_height="wrap_content" />
28100

utils/src/main/java/com/haoge/easyandroid/easy/EasyFormatter.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,10 +127,10 @@ class EasyFormatter private constructor(private val builder: Builder) {
127127
|| name.startsWith("javax")
128128
|| name.startsWith("kotlin")) {
129129
// 不对系统提供的类进行格式化
130-
return StringBuilder(name)
130+
return StringBuilder(any.toString())
131131
}
132132

133-
val result = StringBuilder("{")
133+
val result = StringBuilder("[${any.javaClass.simpleName}@${any.hashCode()}]{")
134134
val container = mutableMapOf<String, Any>()
135135
scanFields(any, any.javaClass, container)
136136

@@ -252,7 +252,7 @@ class EasyFormatter private constructor(private val builder: Builder) {
252252

253253
private fun checkIfFormatted(any:Any, invoke:()-> StringBuilder):StringBuilder {
254254
return if (list.contains(any)) {
255-
StringBuilder("(circle ref):${any.javaClass.canonicalName}")
255+
StringBuilder("(circle ref):${any.javaClass.simpleName}@${any.hashCode()}")
256256
} else {
257257
list.add(any)
258258
invoke.invoke()

utils/src/main/java/com/haoge/easyandroid/easy/EasyReflect.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,16 +69,16 @@ class EasyReflect private constructor(val clazz: Class<*>, var instance:Any?){
6969
return FieldReflect(field, this)
7070
}
7171

72-
fun getFields():Map<String, FieldReflect> {
73-
val map = mutableMapOf<String, FieldReflect>()
72+
fun getFields():List<FieldReflect> {
73+
val list = mutableListOf<FieldReflect>()
7474
var type:Class<*>? = clazz
7575
do {
7676
for (field in type!!.declaredFields) {
77-
map[field.name] = FieldReflect(accessible(field), this)
77+
list.add(FieldReflect(accessible(field), this))
7878
}
7979
type = type.superclass
8080
} while (type != null)
81-
return map
81+
return list
8282
}
8383

8484
// 普通方法操作区
@@ -149,7 +149,7 @@ class EasyReflect private constructor(val clazz: Class<*>, var instance:Any?){
149149
}
150150

151151
try {
152-
instance = getConstructor().newInstance()
152+
instance = getConstructor().constructor.newInstance()
153153
} catch (e:Exception) {
154154
throw ReflectException("Could not fount default constructor for [${clazz.canonicalName}] to create instance")
155155
}

0 commit comments

Comments
 (0)