使用反射拼装MyBatis Example类里面的方法

1、首先,我们需要弄清楚反射的定义,也就是在运行状态中,对于任何一个类都能够知道类里面有哪些属性和方法,对于任何一个对象,都能够调用里面的属性和方法;简而言之,也就是我们知道一个类的全路径,就能够获取到类里面的属性以及调用类里面的方法;
2、所以弄清楚这个概念后,我们来调用Example类的方法就很简单了;
(1)和所有调用类里的方法一样,我们也需要用到Example类的全路径、方法名

Class clazz=Class.forName("类的全路径");//获取到类对象
Object obj=clazz.newInstance();//获取到类的实例
Method method=obj.getClass().getMethod("or");//获取到类中的or(),这里or方法是无参的,故无须给其传递参数,若是String类型,则写成String.class;(注意:我们在组装方法的时候应该进入到具体类中去看该方法是什么类型的,criteria类型就应该用criteria对象来进行调用,void则可以直接使用obj进行,andPk_ParentEqualTo()就应该用执行完or()的对象来调用)
method.invoke(obj);//执行方法传入实例对象,得到Criteria对象,也就是说如上步骤我们就是在拼装如下example里面的一系列方法,

Example类的操作
(2)然后同理可使用反射来调用mapper中的方法:

//首先,我们也通过mapper接口类路径来获取到接口对象
	Class mapper=Class.forName("mapper路径");
// 因为接口不能直接实例化,所以我们这里通过代理类对其进行实例; 
	Class fcclazz1 = Class.forName(mapperPath);
        //代理创建实例对象
        Object proxy = Proxy.newProxyInstance(fcclazz1.getClassLoader(),//决定了哪个ClassLoader对象来对生成的代理对象进行加载。
                new Class[]{fcclazz1},//表示提供了一组怎么样的接口给他,这个代理对象就实现了该接口(多态),我们就能调用里面的方法了。
                new MyInvocationHandler(FCsqlSessionTemplate.getMapper(fcclazz1)));
// 最后调用接口中的方法“updateByExampleSelective()”
  proxy.getClass().getDeclaredMethod("updateByExampleSelective", fcEntity, fcClazz).invoke(proxy, fcobj, fcobjE);
 // (注意:这个最后调用的这个方法也是对之前我们使用mapper直接调用接口中的updateByExampleSelective()的一个改写)

之前写法如下图:
直接调用里面方法

发布了26 篇原创文章 · 获赞 9 · 访问量 765

猜你喜欢

转载自blog.csdn.net/z19950712/article/details/103783485