[TOC]
> ### `java.lang.Class`
* 所有的反射都要從類 `java.lang.Class`開始進行,而最關鍵的是這個類有三種實例化方法:
* 調用`Object`類中的`getClass()`方法:
```
import java.util.Date;
public class ReflectTest {
public static void main(String[] args) {
Date date = new Date();
Class<?> cls = date.getClass();
System.out.println(cls);
}
}
"class java.util.Date"
```
* 使用`類.class`取得:
```
import java.util.Date;
public class ReflectTest {
public static void main(String[] args) {
Class<?> cls = Date.class;
System.out.println(cls);
}
}
"class java.util.Date"
```
* 通過`Class.forName("com.xxx.ClassName")`
```
public class ReflectTest5 {
public static void main(String[] args) throws ClassNotFoundException {
Class<?> cls = Class.forName("java.util.Date");
System.out.println(cls);
}
}
"class java.util.Date"
```
<br/>
> ### 反射類實例化對象
```
Class<?> cls = Class.forName("java.util.Date");
Object date = cls.newInstance();
```
<br/>
> ### 通過反射實現的工廠模式
* 在`Factory`類中通過`className`反射出類并實例化對象,實現了`Factory`與`Fruit`接口實現類的解耦,當`Fruit`新增時無需修改`Factory`類。
```
// 轉自 https://juejin.im/post/5ab99b10f265da239c7b5e52
interface Fruit{
void eat();
}
class Apple implements Fruit{
@Override
public void eat() {
System.out.println("* 吃蘋果 *");
}
}
class Orange implements Fruit{
@Override
public void eat() {
System.out.println("* 吃橘子 *");
}
}
class Factory{
public static Fruit getInstance(String className){
Fruit f = null;
try {
// 根據className反射出類并實例化對象
// 優化了Factory,與Fruit接口的實現類解耦
// 若不使用反射,則需要程序判斷className并new相應的實例,當Fruit新增時,Factory也要修改
f = (Fruit) Class.forName(className).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return f;
}
}
public class TestFactory {
public static void main(String[] args) {
Fruit f = Factory.getInstance("com.jkx.lzh.test.Apple");
f.eat();
}
}
```
<br/>
> ### 獲取類的所有變量信息
> ### 獲取類的所有方法信息
> ### 訪問或操作類的私有變量和方法
<br/>
<br/>
***
參考:
[淺析JAVA反射](https://juejin.im/post/5ab99b10f265da239c7b5e52)
[Java 反射由淺入深 ](https://juejin.im/post/598ea9116fb9a03c335a99a4)
- asD
- Java
- Java基礎
- Java編譯器
- 反射
- collection
- IO
- JDK
- HashMap
- ConcurrentHashMap
- LinkedHashMap
- TreeMap
- 阻塞隊列
- java語法
- String.format()
- JVM
- JVM內存、對象、類
- JVM GC
- JVM監控
- 多線程
- 基礎概念
- volatile
- synchronized
- wait_notify
- join
- lock
- ThreadLocal
- AQS
- 線程池
- Spring
- IOC
- 特性介紹
- getBean()
- creatBean()
- createBeanInstance()
- populateBean()
- AOP
- 基本概念
- Spring處理請求的過程
- 注解
- 微服務
- 服務注冊與發現
- etcd
- zk
- 大數據
- Java_spark
- 基礎知識
- Thrift
- hdfs
- 計算機網絡
- OSI七層模型
- HTTP
- SSL
- 數據庫
- Redis
- mysql
- mybatis
- sql
- 容器
- docker
- k8s
- nginx
- tomcat
- 數據結構/算法
- 排序算法
- 快排
- 插入排序
- 歸并排序
- 堆排序
- 計算時間復雜度
- leetcode
- LRU緩存
- B/B+ 樹
- 跳躍表
- 設計模式
- 單例模式
- 裝飾者模式
- 工廠模式
- 運維
- git
- 前端
- thymeleaf
- 其他
- 代碼規范
- work_project
- Interview