前言
说起发射,先说正射是什么,我们代码中通过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();
获取属性
-
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
注解获取类
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: 【由浅入深学MySQL】- MySQL连接查询详解
本系列为:MySQL数据库详解,为千锋教育资深Java教学老师独家创作 致力于为大家讲解清晰MySQL数据库相关知识点,含有丰富的代码案例及讲解。如果感觉对大家有帮助的话,可以【点个关注】持续追更~ 文末有重点总结和福利内容! 技术类问题,也欢迎大家和我们沟通…