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的新特性--反射的资料请关注脚本之家其它相关文章!
相关文章
SpringBoot使用@ControllerAdvice全局异常处理
这篇文章主要介绍了SpringBoot使用@ControllerAdvice全局异常处理,异常处理是非常重要的一部分,它可以帮助我们捕获并处理应用程序中出现的异常情况,提高应用程序的健壮性和可靠性,需要的朋友可以参考下2023-07-07springboot集成springsession如何实现分布式session共享
这篇文章主要介绍了springboot集成springsession如何实现分布式session共享问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2023-09-09Spring Security中的Servlet过滤器体系代码分析
这篇文章主要介绍了Spring Security中的Servlet过滤器体系,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-07-07
最新评论