反射、泛型、容器

697 阅读2分钟

反射

为什么要有反射?

  1. 运行期,根据某种条件才能确定使用哪个类的对象的时候,就可以采用反射。
  • 策略模式(灵活)

    abstract BaseStrategy.excute()

    ```abstract BaseStrategy.excute(){
        //执行某种策略
    }
    
    • 策略: AStrategy、BStrategy 、CStrategy
  1. Class personClass = Class.forName("com.data.muse")

    Class personClass1 = Class.forName("com.data.muse")

    personClass 和 personClass1是相同的

  2. 获得class对象有几种方式?

    • getClass Class class1 = person.getClass()
    • class Class class2 = Person.class()
    • class.forName Class class3 = Class.forName(com.xxx)
  3. 如何通过class文件获取对象

    1. 获得class

      Class personClass = Class.forName(com.person)

    2. 获得构造方法

      Constructor<Person> constructor = personClass.getConstructor()//获得构造方法

      Person person = constructor.newInstance() //初始化生成Person对象

    3. 通过Class对象,获得Field对象 Person类的那么属性

      Filed nameFiled = personClass.getFiled("name") //获取类中name的属性

    4. 操作Filed,获得属性值

      String name = String.valueOf(nameFiled.get(person))

BeanUtil是干嘛用的

实际工作中

1. 单体服务、微服务(垂直分割)
2. 服务的层次划分(水平分割)
  • 通过反射,可以将对象的属性值赋值给另一个对象

图片.png

容器

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,旧的数组)方法  

图片.png

LinkedList

获得一个Node

图片.png

add:

图片.png

get

先将判断index在前半部分还是后半部分,然后for循环遍历,遍历到最后一个就是该值

图片.png

remove:

所有对数组进行的操作都要进行数组越界的校验

图片.png

相当于将要删除的节点的前后节点与其断开,将前后节点相连接

图片.png