Skip to content

Commit f880b7a

Browse files
committed
updates
1 parent 010d494 commit f880b7a

16 files changed

+115
-113
lines changed

第10章 反射机制/Java动态代理.md

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
## 公共技术点之 Java 动态代理
22

3-
![收藏](http://a.codekk.com/images/icon/ic_favorite_white.png) 项目:[Jave Proxy](http://www.grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b27/java/lang/reflect/Proxy.java#Proxy),分析者:[Caij](https://github.com/Caij),校对者:[Trinea](https://github.com/Trinea)
4-
5-
> 本文为 [Android 开源项目源码解析](http://a.codekk.com/) 公共技术点中的 动态代理 部分
6-
> 项目地址:[Jave Proxy](http://www.grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b27/java/lang/reflect/Proxy.java#Proxy),分析的版本:[openjdk 1.6](http://www.grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b27/java/lang/reflect/Proxy.java#Proxy),Demo 地址:[Proxy Demo](https://github.com/android-cn/android-open-project-demo/tree/master/java-dynamic-proxy)
7-
> 分析者:[Caij](https://github.com/Caij),校对者:[Trinea](https://github.com/Trinea),校对状态:完成
3+
> [原文链接:Android 开源项目源码解析](http://a.codekk.com/) | Demo 地址:[Proxy Demo](https://github.com/android-cn/android-open-project-demo/tree/master/java-dynamic-proxy)
84
95
## 1. 相关概念
106

第10章 反射机制/Java反射.md

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
## 公共技术点之 Java 反射 Reflection
22

3-
![收藏](http://a.codekk.com/images/icon/ic_favorite_white.png) 项目:Java反射,分析者:[Mr.Simple](https://github.com/bboyfeiyu),校对者:[Trinea](https://github.com/Trinea)
4-
5-
> 本文为 [Android 开源项目源码解析](http://a.codekk.com/) 公共技术点中的 Java 反射 部分
6-
> 分析者:[Mr.Simple](https://github.com/bboyfeiyu),校对者:[Trinea](https://github.com/Trinea),校对状态:未完成
3+
> [原文链接:Android 开源项目源码解析](http://a.codekk.com/)
74
85
## 1. 了解 Java 中的反射
96

@@ -365,7 +362,7 @@ private static void showInterfaces() {
365362

366363
## 6. 获取注解信息
367364

368-
在框架开发中,注解加反射的组合使用是最为常见形式的。关于注解方面的知识请参考[公共技术点之 Java 注解 Annotation](http://a.codekk.com/detail/Android/Trinea/%E5%85%AC%E5%85%B1%E6%8A%80%E6%9C%AF%E7%82%B9%E4%B9%8B%20Java%20%E6%B3%A8%E8%A7%A3%20Annotation),定义注解时我们会通过@Target 指定该注解能够作用的类型,看如下示例:
365+
在框架开发中,注解加反射的组合使用是最为常见形式的。关于注解方面的知识请参考[公共技术点之 Java 注解 Annotation](注解.md),定义注解时我们会通过@Target 指定该注解能够作用的类型,看如下示例:
369366

370367
```java
371368
@Target({

第10章 反射机制/Java注解.md

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
## 公共技术点之 Java 注解 Annotation
22

3-
![收藏](http://a.codekk.com/images/icon/ic_favorite_white.png) 项目:Java注解,分析者:[Trinea](https://github.com/Trinea),校对者:[Trinea](https://github.com/Trinea)
4-
5-
> 本文为 [Android 开源项目源码解析](http://a.codekk.com/) 公共技术点中的 注解 部分
6-
> 分析者:[Trinea](https://github.com/Trinea),校对者:[Trinea](https://github.com/Trinea),校对状态:完成
3+
> [原文链接:Android 开源项目源码解析](http://a.codekk.com/)
74
85
不少开源库都用到了注解的方式来简化代码提高开发效率。
96
本文简单介绍下 **Annotation 示例、概念及作用、分类、自定义、解析,并对几个 Android 开源库 Annotation 原理进行简析**
@@ -26,7 +23,7 @@ User getUser(@Path("username") String username);
2623

2724
```
2825

29-
Butter Knife Annotation
26+
ButterKnife Annotation
3027

3128
```java
3229
@InjectView(R.id.user) EditText username;
@@ -40,9 +37,9 @@ ActiveAndroid Annotation
4037
4138
```
4239
43-
Retrofit 为符合 RESTful 规范的网络请求框架
44-
Butter Knife 为 View 及事件等依赖注入框架
45-
Active Android 为 ORM 框架
40+
Retrofit 为符合 RESTful 规范的网络请求框架
41+
Butter Knife 为 View 及事件等依赖注入框架
42+
Active Android 为 ORM 框架
4643
更多见:[Android 开源项目汇总](https://github.com/Trinea/android-open-project)
4744
4845
### 2. Annotation 概念及作用
@@ -153,12 +150,18 @@ public @interface MethodInfo {
153150
```
154151
155152
这里是 MethodInfo 的实现部分
156-
(1). 通过 @interface 定义,注解名即为自定义注解名
157-
(2). 注解配置参数名为注解类的方法名,且:
158-
a. 所有方法没有方法体,没有参数没有修饰符,实际只允许 public & abstract 修饰符,默认为 public,不允许抛异常
159-
b. 方法返回值只能是基本类型,String, Class, annotation, enumeration 或者是他们的一维数组
160-
c. 若只有一个默认属性,可直接用 value() 函数。一个属性都没有表示该 Annotation 为 Mark Annotation
161-
(3). 可以加 default 表示默认值
153+
154+
- 通过 @interface 定义,注解名即为自定义注解名
155+
156+
- 注解配置参数名为注解类的方法名,且
157+
158+
- 所有方法没有方法体,没有参数没有修饰符,实际只允许 public & abstract 修饰符,默认为 public,不允许抛异
159+
160+
- 方法返回值只能是基本类型,String, Class, annotation, enumeration 或者是他们的一维数组
161+
162+
- 若只有一个默认属性,可直接用 value() 函数。一个属性都没有表示该 Annotation 为 Mark Annotation
163+
164+
- 可以加 default 表示默认值
162165
163166
#### 4.3 元 Annotation
164167
@@ -215,7 +218,7 @@ MethodInfo.class);
215218
216219
(1) 编译时 Annotation 指 @Retention 为 CLASS 的 Annotation,甴编译器自动解析。需要做的
217220
218-
a. 自定义类集成自 AbstractProcessor
221+
a. 自定义类集成自 AbstractProcessor
219222
b. 重写其中的 process 函数
220223
221224
这块很多同学不理解,实际是编译器在编译时自动查找所有继承自 AbstractProcessor 的类,然后调用他们的 process 方法去处理
@@ -241,9 +244,10 @@ public class MethodInfoProcessor extends AbstractProcessor {
241244
242245
```
243246
244-
SupportedAnnotationTypes 表示这个 Processor 要处理的 Annotation 名字。
245-
process 函数中参数 annotations 表示待处理的 Annotations,参数 env 表示当前或是之前的运行环境
246-
process 函数返回值表示这组 annotations 是否被这个 Processor 接受,如果接受后续子的 rocessor 不会再对这个 Annotations 进行处理
247+
SupportedAnnotationTypes 表示这个 Processor 要处理的 Annotation 名字。
248+
process 函数中参数 annotations 表示待处理的 Annotations,参数 env 表示当前或是之前的运行环境
249+
process 函数返回值表示这组 annotations 是否被这个 Processor 接受,如果接受后续子的
250+
rocessor 不会再对这个 Annotations 进行处理
247251
248252
### 6. 几个 Android 开源库 Annotation 原理简析
249253
@@ -270,7 +274,8 @@ public @interface GET {
270274
271275
```
272276
273-
从定义可看出 Retrofit 的 Get Annotation 是运行时 Annotation,并且只能用于修饰 Method
277+
从定义可看出 Retrofit 的 Get Annotation 是运行时 Annotation,并且只能用于修饰 Method
278+
274279
(3) 原理
275280
276281
```java
@@ -316,7 +321,8 @@ public @interface InjectView {
316321
317322
```
318323
319-
可看出 Butter Knife 的 InjectView Annotation 是编译时 Annotation,并且只能用于修饰属性
324+
可看出 Butter Knife 的 InjectView Annotation 是编译时 Annotation,并且只能用于修饰属性
325+
320326
(3) 原理
321327
322328
```java
@@ -368,6 +374,7 @@ public @interface Column {
368374
```
369375

370376
可看出 ActiveAndroid 的 Column Annotation 是运行时 Annotation,并且只能用于修饰属性。
377+
371378
(3) 原理
372379

373380
```java

第10章 反射机制/Java注解Annotation基础.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ java.lang.reflect.AnnotatedElement接口是所有程序元素(例如java.lang.
303303

304304
**为了获取注解信息,必须使用反射知识。**
305305

306-
**\*PS:如果想要在运行时提取注解信息,在定义注解时,该注解必须使用@Retention(RetentionPolicy.RUNTIME)修饰。***
306+
PS:如果想要在运行时提取注解信息,在定义注解时,该注解必须使用@Retention(RetentionPolicy.RUNTIME)修饰。
307307

308308
### **2.3 示例**
309309

第10章 反射机制/img/Element.png

18.2 KB
Loading

第10章 反射机制/依赖注入.md

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
## 公共技术点之依赖注入
22

3-
![收藏](http://a.codekk.com/images/icon/ic_favorite_white.png) 项目:,分析者:[扔物线](https://github.com/rengwuxian),校对者:[Trinea](https://github.com/Trinea)
4-
5-
> 本文为 [Android 开源项目源码解析](http://a.codekk.com/) 公共技术点中的 依赖注入 部分
6-
> 分析者:[扔物线](https://github.com/rengwuxian),校对者:[Trinea](https://github.com/Trinea),校对状态:完成
3+
> [Android 开源项目源码解析](http://a.codekk.com/)
74
85
## 1. 依赖
96

第10章 反射机制/动态代理.md

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
##**系列阅读**
1+
## 系列阅读
22
- [Java基础:类加载器](http://blog.csdn.net/axi295309066/article/details/52893604)
33
- [Java基础:反射](http://blog.csdn.net/axi295309066/article/details/52888711)
44
- [Java基础:注解](http://blog.csdn.net/axi295309066/article/details/52893032)
55
- [Java基础:动态代理](http://blog.csdn.net/axi295309066/article/details/52892859)
66

7-
##**1. 概述**
7+
## 1. 概述
88
在运行时,动态创建一组指定的接口的实现类对象(代理对象)!
99

1010
代理是实现AOP(面向切面编程)的核心和关键技术,动态代理的用途与装饰模式很相似,就是为了对某个对象进行增强。所有使用装饰者模式的案例都可以使用动态代理来替换。
@@ -17,7 +17,7 @@
1717

1818
而程序运行过程中产生对象其实就是我们刚才反射讲解的内容,所以,动态代理其实就是通过反射来生成一个代理
1919

20-
##**2. 工作原理**
20+
## 2. 工作原理
2121

2222
- client调用代理
2323
- 代理的构造方法接收一个invocationhandler参数
@@ -26,7 +26,7 @@
2626

2727
![动态代理](http://img.blog.csdn.net/20161022160329156)
2828

29-
1、在Java中java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口就可以生成动态代理对象。JDK提供的代理只能针对接口做代理。我们有更强大的代理cglib
29+
1、在Java中java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口就可以生成动态代理对象。JDK提供的代理只能针对接口做代理。我们有更强大的代理[cglib](https://github.com/cglib/cglib)
3030

3131
2、Proxy类中的方法创建动态代理类对象
3232

@@ -48,14 +48,17 @@ Object invoke(Object proxy,Method method,Object[] args)
4848

4949
4、Proxy类中创建动态代理对象的方法的三个参数
5050

51-
- **ClassLoader对象**
52-
定义了由哪个ClassLoader对象来对生成的代理对象进行加载
51+
- ClassLoader对象
5352

54-
- **Interface对象的数组**
55-
表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
53+
定义了由哪个ClassLoader对象来对生成的代理对象进行加载
5654

57-
- **InvocationHandler对象**
58-
表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上
55+
- Interface对象的数组
56+
57+
表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
58+
59+
- InvocationHandler对象
60+
61+
表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上
5962

6063
每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的invoke 方法来进行调用。
6164

@@ -71,7 +74,7 @@ Object invoke(Object proxy,Method method,Object[] args)
7174

7275
创建的代理对象是在jvm运行时动态生成的一个对象,它并不是我们的InvocationHandler类型,也不是我们定义的那组接口的类型,而是在运行是动态生成的一个对象,并且命名方式都是这样的形式,以$开头,proxy为中,最后一个数字表示对象的标号
7376

74-
##**3. 动态代理的实现**
77+
## 3. 动态代理的实现
7578

7679
```java
7780
package cn.itcast_06;
@@ -200,7 +203,7 @@ public class Test {
200203
}
201204
```
202205

203-
##**4. Spring原理**
206+
## 4. Spring原理
204207

205208
```java
206209
public class ProxyFactoryBean {
@@ -300,4 +303,4 @@ public class AopFrameworkTest {
300303
((Collection)bean).clear();
301304
}
302305
}
303-
```
306+
```

第10章 反射机制/反射.md

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# **反射注解动态代理相关阅读**
2-
- [Java基础:类加载器](http://blog.csdn.net/axi295309066/article/details/52893604)
3-
- [Java基础:反射](http://blog.csdn.net/axi295309066/article/details/52888711)
4-
- [Java基础:注解](http://blog.csdn.net/axi295309066/article/details/52893032)
5-
- [Java基础:动态代理](http://blog.csdn.net/axi295309066/article/details/52892859)
2+
- [Java基础:类加载器](类加载器.md)
3+
- [Java基础:反射](反射.md)
4+
- [Java基础:注解](注解.md)
5+
- [Java基础:动态代理](动态代理.md)
66

77
# **1. 反射概述**
88
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
@@ -18,7 +18,7 @@ Java中,反射是一种强大的工具。它使您能够创建灵活的代码
1818

1919
你可能觉得这没有什么神奇的,那是你还没了解我说的是什么!你需要再想一想,写一个方法,参数是Object obj,然后你的方法需要创建一个与参数类型相同的对象出来,还要调用这个对象上的方法。需要注意,参数是Object类型,但用户调用这个方法时,可能传递的不是Object实体对象,它的真实类型有可能是任何类型。
2020

21-
目前好多框架都会用到java的反射机制。比如struts2,sping,hibernate。 如果我们不用struts2,自己写一个类似的功能也是可以实现的,比如浏览器通过HTTP发送数据,而这些数据都是字符串,我们接受到这些字符串时, 可以通过反射去构造一个对象(通过拦截器做成框架的功能),这样就可以用对象的get和set方法了,而不用原始的getPeremter()方法。事实上, 在struts2出来之前,我们又不想用struts1的ActionForm就做过这样项目。
21+
目前好多框架都会用到java的反射机制。比如struts2,spring,hibernate。 如果我们不用struts2,自己写一个类似的功能也是可以实现的,比如浏览器通过HTTP发送数据,而这些数据都是字符串,我们接受到这些字符串时, 可以通过反射去构造一个对象(通过拦截器做成框架的功能),这样就可以用对象的get和set方法了,而不用原始的getPeremter()方法。事实上, 在struts2出来之前,我们又不想用struts1的ActionForm就做过这样项目。
2222

2323
Java反射机制主要提供了以下功能:
2424

@@ -327,9 +327,7 @@ ParameterizedType 表示参数化类型,如 Collection<String>
327327
```java
328328
public abstract class BaseProtocol<T> {
329329

330-
...
331-
332-
/**泛型解析*/
330+
// 泛型解析
333331
protected T parsejson(String jsonString){
334332
ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
335333
Type[] args = genericSuperclass.getActualTypeArguments();

0 commit comments

Comments
 (0)