反射,泛型,容器

 

反射  

   类加载(加载,验证,准备,解析,初始化),class文件包含了所有的类信息,

 

 

 

反射是发生在运行期,  

 

 

 

他们俩的区别图为:  

 

 

  普通的new对象, 编译器加载class。然后查找构造函数,通过构造函数生成对象

反射:运行期加载class,创建构造函数,通过构造函数生成对象

 反射:

     三种获取class方式:  Class.forName() :类.class  . 实体类.getclass()

     创建构造函数:getConstuctor();

            通过无参构造方法创建对象: newInstance();

/** 首先:获得Person的字节码 */
Class personClazz = Class.forName("com.xx.reflect.Person");

/** 其次:通过Class对象,创建构造方法对象 */
Constructor constructor1 = personClazz.getConstructor(String.class, Integer.class, Byte.class,
Boolean.class); // 初始化有参构造方法对象
Constructor constructor = personClazz.getConstructor(); // 初始化无参构造方法

/** 最后:通过构造方法创建对象 */
// 调用无参数构造方法创建Person对象
Person person = (Person) constructor.newInstance();
person.setName("muse1");
System.out.println("person=" + person);

// 调用有参数构造方法创建Person对象
Person person1 = (Person) constructor1.newInstance("muse1", 10, (byte) 1, true);
System.out.println("person1=" + person1);


 

获取public对象直接用

Field nameField = personClazz.getField("name");

获取private对象

Field sexField = personClazz.getDeclaredField("sex");
sexField.setAccessible(true);

 

 

 BeanUtils

  泛型    (不用强转  安全 )

  类型参数化

  允许在定义类、接口、方法时使用类型形参,当使用时
指定具体类型
       所有使用该泛型参数的地方都被统一化,保证类型一致。
如果未指定具体类型,默认是Objec t类型。集合体系中
的所有类都增加了泛型,泛型也主要用在集合
PECS(Producer Extends Consumer Super)
https://www.cnblogs.com/huoqm/p/13931363.html
/**
* 【读取】
* 如果要从集合中读取类型T的数据,并且不能写入,可以使用 ? extends 通配符;(Producer Extends)
*/

/**
* 【写入】
* 如果要从集合中写入类型T的数据,并且不需要读取,可以使用 ? super 通配符;(Consumer Super)
* <p>
* 如果既要存又要取,那么就不要使用任何通配符。
*/

泛型擦除(类加载成class后会擦除泛型,里边的T变成object) 和桥接(重写object调用super.method)
  1. 容器

arraylist 底层数组  默认容量10  负载因子0.5

linklist   底层双向链表

hashmap  数组+链表/红黑树   默认16  负载因子。0.75

  当链表长度>8 并且 table的size大于64  链表才会转换为红黑树

  add方法

       懒加载模式  第一次add才会初始化map 

    key.hash  高16不变,低16与高16位异或得出key的hash  

   判断在数组的那个位置是(table.size-1)&key.hash 来决定哪一个槽

posted @ 2021-02-15 23:34  SinceJuly~  阅读(53)  评论(0)    收藏  举报