Skip to content

Commit 172a11c

Browse files
committed
反射单独成文
1 parent 2aed7e3 commit 172a11c

File tree

3 files changed

+138
-145
lines changed

3 files changed

+138
-145
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ Github用户如果访问速度缓慢的话,可以转移到[码云](https://git
9292

9393
1. [枚举](docs/java/basis/用好Java中的枚举真的没有那么简单.md) (很重要的一个数据结构,用好枚举真的没有那么简单!)
9494
2. [Java 常见关键字总结:final、static、this、super!](docs/java/basis/final、static、this、super.md)
95+
3. [什么是反射机制?反射机制的应用场景有哪些?](docs/java/basis/reflection.md)
9596

9697
### 容器
9798

docs/java/Basis/reflection.md

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
### 反射机制介绍
2+
3+
JAVA 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 java 语言的反射机制。
4+
5+
### 获取 Class 对象的两种方式
6+
7+
如果我们动态获取到这些信息,我们需要依靠 Class 对象。Class 类对象将一个类的方法、变量等信息告诉运行的程序。Java 提供了两种方式获取 Class 对象:
8+
9+
1.知道具体类的情况下可以使用:
10+
11+
```java
12+
Class alunbarClass = TargetObject.class;
13+
```
14+
15+
但是我们一般是不知道具体类的,基本都是通过遍历包下面的类来获取 Class 对象
16+
17+
2.通过 `Class.forName()`传入类的路径获取:
18+
19+
```java
20+
Class alunbarClass1 = Class.forName("cn.javaguide.TargetObject");
21+
```
22+
23+
### 代码实例
24+
25+
**简单用代码演示一下反射的一些操作!**
26+
27+
1.创建一个我们要使用反射操作的类 `TargetObject`
28+
29+
```java
30+
package cn.javaguide;
31+
32+
public class TargetObject {
33+
private String value;
34+
35+
public TargetObject() {
36+
value = "JavaGuide";
37+
}
38+
39+
public void publicMethod(String s) {
40+
System.out.println("I love " + s);
41+
}
42+
43+
private void privateMethod() {
44+
System.out.println("value is " + value);
45+
}
46+
}
47+
```
48+
49+
2.使用反射操作这个类的方法以及参数
50+
51+
```java
52+
package cn.javaguide;
53+
54+
import java.lang.reflect.Field;
55+
import java.lang.reflect.InvocationTargetException;
56+
import java.lang.reflect.Method;
57+
58+
public class Main {
59+
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchFieldException {
60+
/**
61+
* 获取TargetObject类的Class对象并且创建TargetObject类实例
62+
*/
63+
Class<?> tagetClass = Class.forName("cn.javaguide.TargetObject");
64+
TargetObject targetObject = (TargetObject) tagetClass.newInstance();
65+
/**
66+
* 获取所有类中所有定义的方法
67+
*/
68+
Method[] methods = tagetClass.getDeclaredMethods();
69+
for (Method method : methods) {
70+
System.out.println(method.getName());
71+
}
72+
/**
73+
* 获取指定方法并调用
74+
*/
75+
Method publicMethod = tagetClass.getDeclaredMethod("publicMethod",
76+
String.class);
77+
78+
publicMethod.invoke(targetObject, "JavaGuide");
79+
/**
80+
* 获取指定参数并对参数进行修改
81+
*/
82+
Field field = tagetClass.getDeclaredField("value");
83+
//为了对类中的参数进行修改我们取消安全检查
84+
field.setAccessible(true);
85+
field.set(targetObject, "JavaGuide");
86+
/**
87+
* 调用 private 方法
88+
*/
89+
Method privateMethod = tagetClass.getDeclaredMethod("privateMethod");
90+
//为了调用private方法我们取消安全检查
91+
privateMethod.setAccessible(true);
92+
privateMethod.invoke(targetObject);
93+
}
94+
}
95+
96+
```
97+
98+
输出内容:
99+
100+
```
101+
publicMethod
102+
privateMethod
103+
I love JavaGuide
104+
value is JavaGuide
105+
```
106+
107+
### 静态编译和动态编译
108+
109+
- **静态编译:**在编译时确定类型,绑定对象
110+
- **动态编译:**运行时确定类型,绑定对象
111+
112+
### 反射机制优缺点
113+
114+
- **优点:** 运行期类型的判断,动态加载类,提高代码灵活度。
115+
- **缺点:** 1,性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的 java 代码要慢很多。2,安全问题,让我们可以动态操作改变类的属性同时也增加了类的安全隐患。
116+
117+
### 反射的应用场景
118+
119+
**反射是框架设计的灵魂。**
120+
121+
在我们平时的项目开发过程中,基本上很少会直接使用到反射机制,但这不能说明反射机制没有用,实际上有很多设计、开发都与反射机制有关,例如模块化的开发,通过反射去调用对应的字节码;动态代理设计模式也采用了反射机制,还有我们日常使用的 Spring/Hibernate 等框架也大量使用到了反射机制。
122+
123+
举例:
124+
125+
1. 我们在使用 JDBC 连接数据库时使用 `Class.forName()`通过反射加载数据库的驱动程序;
126+
2. Spring 框架的 IOC(动态加载管理 Bean)创建对象以及 AOP(动态代理)功能都和反射有联系;
127+
3. 动态配置实例的属性;
128+
4. ......
129+
130+
**推荐阅读:**
131+
132+
- [Reflection:Java 反射机制的应用场景](https://segmentfault.com/a/1190000010162647?utm_source=tuicool&utm_medium=referral)
133+
- [Java 基础之—反射(非常重要)](https://blog.csdn.net/sinat_38259539/article/details/71799078)
134+
135+
##

docs/java/Java基础知识.md

Lines changed: 2 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,7 @@
5555
- [BIO,NIO,AIO 有什么区别?](#bionioaio-有什么区别)
5656
- [36. 常见关键字总结:static,final,this,super](#36-常见关键字总结staticfinalthissuper)
5757
- [37. Collections 工具类和 Arrays 工具类常见方法总结](#37-collections-工具类和-arrays-工具类常见方法总结)
58-
- [38. 深拷贝 vs 浅拷贝](#38-深拷贝-vs-浅拷贝)
59-
- [38.什么是反射机制?反射机制的应用场景有哪些?](#38什么是反射机制反射机制的应用场景有哪些)
60-
- [反射机制介绍](#反射机制介绍)
61-
- [获取 Class 对象的两种方式](#获取-class-对象的两种方式)
62-
- [代码实例](#代码实例)
63-
- [静态编译和动态编译](#静态编译和动态编译)
64-
- [反射机制优缺点](#反射机制优缺点)
65-
- [反射的应用场景](#反射的应用场景)
58+
- [38.深拷贝 vs 浅拷贝](#38-深拷贝-vs-浅拷贝)
6659
- [参考](#参考)
6760
- [公众号](#公众号)
6861

@@ -548,149 +541,13 @@ Java Io 流共涉及 40 多个类,这些类看上去很杂乱,但实际上
548541

549542
详见笔主的这篇文章: <https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/java/Basis/Arrays,CollectionsCommonMethods.md>
550543

551-
### 38. 深拷贝 vs 浅拷贝
544+
## 38. 深拷贝 vs 浅拷贝
552545

553546
1. **浅拷贝**:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。
554547
2. **深拷贝**:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。
555548

556549
![deep and shallow copy](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/java-deep-and-shallow-copy.jpg)
557550

558-
## 38.什么是反射机制?反射机制的应用场景有哪些?
559-
560-
### 反射机制介绍
561-
562-
JAVA 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 java 语言的反射机制。
563-
564-
### 获取 Class 对象的两种方式
565-
566-
如果我们动态获取到这些信息,我们需要依靠 Class 对象。Class 类对象将一个类的方法、变量等信息告诉运行的程序。Java 提供了两种方式获取 Class 对象:
567-
568-
1.知道具体类的情况下可以使用:
569-
570-
```java
571-
Class alunbarClass = TargetObject.class;
572-
```
573-
574-
但是我们一般是不知道具体类的,基本都是通过遍历包下面的类来获取 Class 对象
575-
576-
2.通过 `Class.forName()`传入类的路径获取:
577-
578-
```java
579-
Class alunbarClass1 = Class.forName("cn.javaguide.TargetObject");
580-
```
581-
582-
### 代码实例
583-
584-
**简单用代码演示一下反射的一些操作!**
585-
586-
1.创建一个我们要使用反射操作的类 `TargetObject`:
587-
588-
```java
589-
package cn.javaguide;
590-
591-
public class TargetObject {
592-
private String value;
593-
594-
public TargetObject() {
595-
value = "JavaGuide";
596-
}
597-
598-
public void publicMethod(String s) {
599-
System.out.println("I love " + s);
600-
}
601-
602-
private void privateMethod() {
603-
System.out.println("value is " + value);
604-
}
605-
}
606-
```
607-
608-
2.使用反射操作这个类的方法以及参数
609-
610-
```java
611-
package cn.javaguide;
612-
613-
import java.lang.reflect.Field;
614-
import java.lang.reflect.InvocationTargetException;
615-
import java.lang.reflect.Method;
616-
617-
public class Main {
618-
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchFieldException {
619-
/**
620-
* 获取TargetObject类的Class对象并且创建TargetObject类实例
621-
*/
622-
Class<?> tagetClass = Class.forName("cn.javaguide.TargetObject");
623-
TargetObject targetObject = (TargetObject) tagetClass.newInstance();
624-
/**
625-
* 获取所有类中所有定义的方法
626-
*/
627-
Method[] methods = tagetClass.getDeclaredMethods();
628-
for (Method method : methods) {
629-
System.out.println(method.getName());
630-
}
631-
/**
632-
* 获取指定方法并调用
633-
*/
634-
Method publicMethod = tagetClass.getDeclaredMethod("publicMethod",
635-
String.class);
636-
637-
publicMethod.invoke(targetObject, "JavaGuide");
638-
/**
639-
* 获取指定参数并对参数进行修改
640-
*/
641-
Field field = tagetClass.getDeclaredField("value");
642-
//为了对类中的参数进行修改我们取消安全检查
643-
field.setAccessible(true);
644-
field.set(targetObject, "JavaGuide");
645-
/**
646-
* 调用 private 方法
647-
*/
648-
Method privateMethod = tagetClass.getDeclaredMethod("privateMethod");
649-
//为了调用private方法我们取消安全检查
650-
privateMethod.setAccessible(true);
651-
privateMethod.invoke(targetObject);
652-
}
653-
}
654-
655-
```
656-
657-
输出内容:
658-
659-
```
660-
publicMethod
661-
privateMethod
662-
I love JavaGuide
663-
value is JavaGuide
664-
```
665-
666-
### 静态编译和动态编译
667-
668-
- **静态编译:**在编译时确定类型,绑定对象
669-
- **动态编译:**运行时确定类型,绑定对象
670-
671-
### 反射机制优缺点
672-
673-
- **优点:** 运行期类型的判断,动态加载类,提高代码灵活度。
674-
- **缺点:** 1,性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的 java 代码要慢很多。2,安全问题,让我们可以动态操作改变类的属性同时也增加了类的安全隐患。
675-
676-
### 反射的应用场景
677-
678-
**反射是框架设计的灵魂。**
679-
680-
在我们平时的项目开发过程中,基本上很少会直接使用到反射机制,但这不能说明反射机制没有用,实际上有很多设计、开发都与反射机制有关,例如模块化的开发,通过反射去调用对应的字节码;动态代理设计模式也采用了反射机制,还有我们日常使用的 SpringHibernate 等框架也大量使用到了反射机制。
681-
682-
举例:
683-
684-
1. 我们在使用 JDBC 连接数据库时使用 `Class.forName()`通过反射加载数据库的驱动程序;
685-
2. Spring 框架的 IOC(动态加载管理 Bean)创建对象以及 AOP(动态代理)功能都和反射有联系;
686-
3. 动态配置实例的属性;
687-
4. ......
688-
689-
**推荐阅读:**
690-
691-
- [ReflectionJava 反射机制的应用场景](https://segmentfault.com/a/1190000010162647?utm_source=tuicool&utm_medium=referral)
692-
- [Java 基础之—反射(非常重要)](https://blog.csdn.net/sinat_38259539/article/details/71799078)
693-
694551
## 参考
695552

696553
- https://stackoverflow.com/questions/1906445/what-is-the-difference-between-jdk-and-jre

0 commit comments

Comments
 (0)