[TOC]
## 获取Class对象
### 使用 Class.forName 静态方法。
当你知道该类的全路径名时,你可以使用该方法获取 Class 类对象。
~~~
Class clz = Class.forName("java.lang.String");
~~~
### 使用 .class 方法
这种方法只适合在编译前就知道操作的 Class。
~~~
Class clz = String.class;
~~~
### 使用类对象的 getClass() 方法。
~~~
String str = new String("Hello");
Class clz = str.getClass();
~~~
## 创建类对象
### 通过 Class 对象的 newInstance() 方法。
~~~
Class clz = Apple.class;
Apple apple = (Apple)clz.newInstance();
~~~
### 通过 Constructor 对象的 newInstance() 方法
~~~
Class clz = Apple.class;
Constructor constructor = clz.getConstructor();
Apple apple = (Apple)constructor.newInstance();
~~~
通过 Constructor 对象创建类对象可以选择特定构造方法,而通过 Class 对象则只能使用默认的无参数构造方法。下面的代码就调用了一个有参数的构造方法进行了类对象的初始化。
~~~
Class clz = Apple.class;
Constructor constructor = clz.getConstructor(String.class, int.class);
Apple apple = (Apple)constructor.newInstance("红富士", 15);
~~~
## 反射获取类属性、方法、构造器
* 通过 Class 对象的 getFields() 方法可以获取 Class 类的属性,但无法获取私有属性。
* 通过Class 对象的getDeclaredFields() 方法则可以获取包括私有属性在内的所有属性。
* 与获取类属性一样,当我们去获取类方法、类构造器时,如果要获取私有方法或私有构造器,则必须使用有 declared 关键字的方法。
## 推荐阅读
[深入解析Java反射(1) - 基础](https://www.sczyh30.com/posts/Java/java-reflection-1/)
[大白话说Java反射:入门、使用、原理](https://www.cnblogs.com/chanshuyi/p/head_first_of_reflection.html)
- Java
- Object
- 内部类
- 异常
- 注解
- 反射
- 静态代理与动态代理
- 泛型
- 继承
- JVM
- ClassLoader
- String
- 数据结构
- Java集合类
- ArrayList
- LinkedList
- HashSet
- TreeSet
- HashMap
- TreeMap
- HashTable
- 并发集合类
- Collections
- CopyOnWriteArrayList
- ConcurrentHashMap
- Android集合类
- SparseArray
- ArrayMap
- 算法
- 排序
- 常用算法
- LeetCode
- 二叉树遍历
- 剑指
- 数据结构、算法和数据操作
- 高质量的代码
- 解决问题的思路
- 优化时间和空间效率
- 面试中的各项能力
- 算法心得
- 并发
- Thread
- 锁
- java内存模型
- CAS
- 原子类Atomic
- volatile
- synchronized
- Object.wait-notify
- Lock
- Lock之AQS
- Lock子类
- 锁小结
- 堵塞队列
- 生产者消费者模型
- 线程池