反射
为什么要有反射?
- 运行期,根据某种条件才能确定使用哪个类的对象的时候,就可以采用反射。
-
策略模式(灵活)
abstract BaseStrategy.excute()
```abstract BaseStrategy.excute(){ //执行某种策略 } -
- 策略: AStrategy、BStrategy 、CStrategy
-
Class personClass = Class.forName("com.data.muse")Class personClass1 = Class.forName("com.data.muse")personClass 和 personClass1是相同的
-
获得class对象有几种方式?
- getClass
Class class1 = person.getClass() - class
Class class2 = Person.class() - class.forName
Class class3 = Class.forName(com.xxx)
- getClass
-
如何通过class文件获取对象
-
获得class
Class personClass = Class.forName(com.person) -
获得构造方法
Constructor<Person> constructor = personClass.getConstructor()//获得构造方法Person person = constructor.newInstance() //初始化生成Person对象 -
通过Class对象,获得Field对象 Person类的那么属性
Filed nameFiled = personClass.getFiled("name") //获取类中name的属性 -
操作Filed,获得属性值
String name = String.valueOf(nameFiled.get(person))
-
BeanUtil是干嘛用的
实际工作中
1. 单体服务、微服务(垂直分割)
2. 服务的层次划分(水平分割)
-
通过反射,可以将对象的属性值赋值给另一个对象
容器
ArrayList:本质是个数组
add: 扩容:add之前需要判断长度是否足够 是否需要扩容
1. 旧的长度的二进制右移一位,相当于原来的长度的1/2,加上原来的长度
2. 新的长度依然无法满足需要的最小的扩容量,则新的长度改为最小扩容量
remove: {"a1","a2","a3","a4"} 例如删除a2
1. 获得需要移动元素的个数 size-index-1 4-1-1=2
2. 调用system.arraycopy(旧的数组,删除元素index+1,旧的数组)方法
LinkedList
获得一个Node
add:
get
先将判断index在前半部分还是后半部分,然后for循环遍历,遍历到最后一个就是该值
remove:
所有对数组进行的操作都要进行数组越界的校验
相当于将要删除的节点的前后节点与其断开,将前后节点相连接