java的新特性反射机制应用及操作示例详解
作者:avatar 小强Zzz
这篇文章主要为大家介绍了java的新特性反射机制的操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
前言
说起发射,先说正射是什么,我们代码中通过User user = new User();
代码创建一个对象,并调用User类的成员变量或方法,这种我们通过Class信息获取class实例,称之为正射,这种代码编译器编译时便知道他会生成一个user对象。
如果我们在写代码时不知道我们要操作的对象类型,他可能是User类型,也可能是House类型,而User类型和Clazz类型有没有继承关系,只知道要调用他的getId()方法,那又该怎么调用对象的方法呢?
反射
对于反射而言,我们获得了一个对象的实例,并且知道了这个对象的类型,那么我们便可以对他进行一切操作。
这是由于JVM为每一个加载的class都创建了一个class实例,并保存了实例的所有信息,包括类型,父类,方法,属性等等,这使得我们可以获取class实例的所有信息。
这种通过class实例获取class信息的方法称为反射
获取class又3种方法
通过一个class的静态变量class获取
Class clazz = User.class;
通过完整包路径获取
Class clazz = Class.forName("xiaoqiangZzz.busticket;");
通过实例获取
Object object = getObject(); Class clazz = object.getClass();
获取到class后,我们也可以通过class创建实例对象
Object object = clazz.newInstance();
Object object = clazz.newInstance();
获取属性
Field getField(name):
根据字段名获取某个public的field(包括父类)Field getDeclaredField(name):
根据字段名获取当前类的某个field(不包括父类)Field[] getFields():
获取所有public的field(包括父类)Field[] getDeclaredFields():
获取当前类的所有field(不包括父类)
public void getId(Object object) throws IllegalAccessException { Class clazz = object.getClass(); Field field = clazz.getField("age"); field.setAccessible(true); System.out.println(field.get(object)); field.setAccessible(false); }
类似的,我们可以获取方法并调用
Method getMethod(name, Class...):
获取某个public的Method(包括父类)Method getDeclaredMethod(name, Class...):
获取当前类的某个Method(不包括父类)Method[] getMethods():
获取所有public的Method(包括父类)Method[] getDeclaredMethods():
获取当前类的所有Method(不包括父类)
public void getMethod(Object object) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { Class clazz = object.getClass(); Method method = clazz.getMethod("getId"); method.invoke(object); }
反射应用
制作一个通用的数据库表导出方法
public void wirte(Object[] objects, Class classN) throws IllegalAccessException { Sheet sheet = new Sheet(); Field[] fields = classN.getDeclaredFields(); for (int i = 1; i < objects.length; i++) { Row row = sheet.createRow(i); for (Field field : fields) { field.setAccessible(true); // 写入单元格 ........... field.setAccessible(false); } }
注解获取类
以上就是java的新特性--反射的详细内容,更多关于java的新特性--反射的资料请关注脚本之家其它相关文章!