Orm_Reflect_DB——Reflect(一)
ORM系列章节列表(点击查阅)
一、ORM之开篇
反射的机制以及概念我这里就不一一阐述了,度娘会告诉你。我这里主要说一下反射的应用和常用方法:
一、反射的应用:
1、反编译.class->.java;
2、通过反射机制访问Java的所有方法、属性、以及实例化对象,设置包括google源码中的hide方法;
3、这个就比较高大上了,可以用于框架的封装,达到最大程度的适配。
二、反射的常用方法:
1、如何获取Class<?>对象,这里的Class是一个类的名字,我们称之为字节码文件类,Java虚拟机会将我们写的Java文件编译成.class文件,从而衍生了这个类,通过访问.class文件的方式,达到访问Java代码的作用。
/**
* 获取Class对象
*/
//第一种方式,通过全类名获取
Class<?> clazz = Class.forName("com.pdm.io.Person");
//第二种,通过属性获取
Class<?> clazz = Object.class;
//第三种,通过getClass方法获取
Class<?> clazz = Object.getClass();
2、如何获取Java类中的方法:
/**
* 获取方法
*/
//根据全类名找到实体类
<span style="white-space:pre"> </span> String className = "com.pdm.io.Person";
//得到实体类对应的Class对象
Class<?> clazz = Class.forName(className);
//实例化类
Object obj = clazz.newInstance();
String methodName = "show";
//这里获得的是公共方法,如果想获取所有方法,可用getDeclaredMethod,第二个参数是传入参数类型的Class集合
Method show = clazz.getMethod(methodName, new Class[]{String.class,int.class});
show.invoke(obj, "pdm" , 56);
3、如何获取Java类中的成员变量:
/**
* 获取字段
*/
String className = "com.pdm.io.Person";
Class<?> clazz = Class.forName(className);
String fieldName = "age";
//获取age字段对象(公共成员字段)getField(fieldName)
//获取所有声明字段
Field field = clazz.getDeclaredField(fieldName);
//设置不做权限检查
field.setAccessible(true);
//要先对其值的设置,必须现有对象
Object obj = clazz.newInstance();
field.set(obj, 56);
4、如何获取获取Java类中的构造函数,实现实例化对象目的:
/**
* 通过指定构造函数初始化对象
* 1、获取字节码文件对象
* 2、获取指定构造函数
* 3、通过构造函数初始化对象
*/
Class<?> clazz = Class.forName("com.pdm.io.Person");
//这里根据传入参数类型找到对应构造
Constructor<?> con= clazz.getDeclaredConstructor(new Class[]{String.class,int.class});
Object obj = con.newInstance("pdm" , 21);
//如果是空参构造实例化,直接通过Class对象newInstance即可
//Object obj = clazz.newInstance();
反射听起来高大上,其实不外如是,用来用去就那几个方法,当然要用好也还是有难度的,Reflect的基础讲完,我们马上进入正题,通过Orm和Reflect实现数据库查询功能吧,相信你们已经非常期待了吧。