反射 就是 把java类中的各种成分映射成相应的类。
例如:Field Method Constructor Package
获得字节码的三中方式:
1.类名.class
2.对象.getClass()
3.Class.forName("类名")
Class.forName("类名")的作用就是获得字节码:
1.如果虚拟机里边有,则直接拿到;
2.如果没有,就让类加载器加载进来,缓存在虚拟机里,拿到
九个预定义Class实例对象:
八个基本类型 boolean byte char short int long float double
和一个void.class
Constructor[] === String.getConstructors()
得到某一个构造方法:
Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);
实例化:
1. new String();
2. constructor.newInstance(initargs)
//class----->constructor----------->new object
3. Class.forName("java.lang.String").newInstance();//默认构造方法
Field========>成员变量
Method========>成员方法
方法与对象没关系,是属于类的
先得到方法,然后针对某个对象调用方法
method对应的是一个静态方法,不需要实例对象
method.invoke(null)
ArrayList 有序集合,把对象的引用放进去按顺序
HashSet 会先比较两个对象是否相同,引用相同的就不会放进去
如果没有重写hashCode 和 equals方法,就比较内存地址
根据哈希码 找到对象对应的存储区域
根据内存地址 算出哈希码,造成存储区域不一样。即使equals方法比较相等,如果没有重写hashCode方法,也可以放进去
例如:Field Method Constructor Package
获得字节码的三中方式:
1.类名.class
2.对象.getClass()
3.Class.forName("类名")
Class.forName("类名")的作用就是获得字节码:
1.如果虚拟机里边有,则直接拿到;
2.如果没有,就让类加载器加载进来,缓存在虚拟机里,拿到
九个预定义Class实例对象:
八个基本类型 boolean byte char short int long float double
和一个void.class
Constructor[] === String.getConstructors()
得到某一个构造方法:
Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);
实例化:
1. new String();
2. constructor.newInstance(initargs)
//class----->constructor----------->new object
3. Class.forName("java.lang.String").newInstance();//默认构造方法
Field========>成员变量
Method========>成员方法
方法与对象没关系,是属于类的
先得到方法,然后针对某个对象调用方法
method对应的是一个静态方法,不需要实例对象
method.invoke(null)
ArrayList 有序集合,把对象的引用放进去按顺序
HashSet 会先比较两个对象是否相同,引用相同的就不会放进去
如果没有重写hashCode 和 equals方法,就比较内存地址
根据哈希码 找到对象对应的存储区域
根据内存地址 算出哈希码,造成存储区域不一样。即使equals方法比较相等,如果没有重写hashCode方法,也可以放进去