反射机制&内省机制
构造器对象获取的方法
1.Class.forName(类路径)
2.Person person = new Person(); person.getclass();
3.Person.class;
// 1. 字节码对象的获取:
Class<?> person = Class.forName("_01_getclass.Person1");
//第二种方法
// Class<Person1> person1Class = Person1.class;
//第三种方法
// Person1 person1 = new Person1();
// Class<? extends Person1> aClass = person1.getClass();
通过反射获取字节码对象的构造器
getConstructors()用来获取所有的公共构造器
getDeclaredConstructors()用来获取所有构造器,包括private
getConstructor()用来获取特定的构造器
getDeclaredConstructor()用来获取任何特定构造器,包括private,使用该方法时候需要暴力访问,setAccessible(true)
(在获取特定的类构造器时候一定要注意里面的数据类型要保持一致,还有暴力访问)
通过反射获取字节码对象中的真实方法
getMethods()可以获取对象中的所有公共方法,包括父类的方法
getDeclaredMethods()可以获取本类所有方法,不包括父类
getMethod()可以获取对象中的任何特定公共方法,包括父类的方法
Method sayHello = aClass.getMethod("sayHello", String.class);
sayHello.invoke(真实对象,方法里的参数);
getDeclaredMethod()可以获取本类任何特定方法,不包括父类
Method doWork = aClass.getDeclaredMethod("doWork", String.class);
doWork.invoke(EO,方法里的参数);
(在获取特定的方法时候一定要注意里面的名称,数据类型要保持一致,还有暴力访问)
通过反射,操作对象中的属性
通过反射来调⽤对象中的字段,必须先要获取到字段对应的字段对象。
第⼀: 获取字段对应的字段对象
第⼆: 通过字段对象,修改字段内容
获取所有字段
public Field[] getFields()
public Field[] getDeclaredFields()
//获取单个字段
Field id = forName.getField("id");
//获取单个字段包括私有的
//Field id = forName.getDeclaredField("id");
//获取私有字段需要暴力访问
//id.setAccessible(true);
Object o1 = forName.newInstance();
id.set(o1,100);//这地方注意要把真实对象放在外面,
// 在里面写的话会造成第二次又出现一个新的,从而调用不到设置的值
// id.set(forName.newInstance(),100);
Object o = id.get(o1);
// Object o = id.get(forName.newInstance());
System.out.println("o = " + o);
javaBean规范
- 使⽤ public 修饰.
- 字段私有化.
- 提供 get/set ⽅法.
- 公共的⽆参数的构造器.(使⽤反射,使⽤字节码对象.newInstance去创建对象.)
什么是属性( property )呢?:
JavaBean 可以封装数据,就是将数据保存到⼀个 bean 对象的属性中的.属性不是字段,属性是通过 get/set ⽅法推导出来的.
规范的get⽅法/获取⽅法/读⽅法: public 修饰,⽆参数,有返回,get开头.
规范的set⽅法/设置⽅法/写⽅法: public 修饰,有参数,⽆返回,set开头.
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
LomBok
- 提⾼开发效率
- 使代码直观、简洁、明了、减少了⼤量冗余代码(⼀般可以节省60%-70%以上的代码)
. 极⼤减少了后期维护成本
内省
先获取类的beanInfo信息
Introspector.getBeanInfo(xxx.calss,Object.class);
获取属性描述器信息返回一个数组
beanInfo.getPropertyDescriptors();
遍历数组,得到每个属性信息,获取属性名字跟类型,获取写入读取方法
getname() getWriteMetod这个对应bean里面的set方法getReadMethod这个对应bean的get方法