整体进程介绍
@param注解 测试类 反射
@param注解
在学习的项目中,@Param主要是用来注解dao类中方法的参数(一般通过#{}方式),便于在对应的daosql.xml文件中引用,可以简化xml配置。如:在UserTradeStatusDAO类中有这么一个函数
/**
* 根据unionId查询记录
* @param unionId
* @return
*/
UserTradeStatusDo selectUserTraseByUnionId(@Param("unionId") String unionId);
其对应的sql. xml里的语句是
<select id="selectUserTraseByUserId" parameterType="Long" resultMap="UserTradeStatusDo"> select <include refid="allColumns"/> from <include refid="tableName"/> where user_id=#{userId} limit 1 </select>
当然这只是操作数据库一种注解方法,另外就是还可以利用继承实现类SqlSessionTemplate中的insert、update等方法,前面一篇文章里介绍过。
另外前面第五篇文章有Spring四大注解,以及第四篇文章的元注解介绍。
测试类
使用测试类时需要先继承编写一个适用于自己工程的测试类,
下面是我在项目中用到的测试类一般继承类
package com.mine.coupon.dal.dao;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
//配置测试运行环境
@ContextConfiguration(locations = {“classpath:dalTest-applicationContext.xml”})
public abstract class AbstractUnitTest extends AbstractJUnit4SpringContextTests {
@Before
public void before() {
System.setProperty("disconf.conf", "application-test.properties");
}
}
然后·测试类就可以进行创建了,在idea中创建是在要测试的类名上按alt +enter,然后创建测试类,如下图所示:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2019070818501684.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0lUU09LXzEyMw==,size_16,color_FFFFFF,t_70)
然后就可以进行编写测试类,就实现测试类来说还是比较简单的,下面是一个测试用户领取优惠券的测试类:
public class CouponFacadeImplTest extends AbstractUnitTest {
@Resource
private CouponFacade couponFacade;
@Test
public void testCudrawCoupon() throws ParseException {
DrawCouponReq drawCouponReq = new DrawCouponReq();
CouponInfo couponInfo = new CouponInfo();
//couponInfo.setId(12350l);
couponInfo.setCouponId(145001l);
couponInfo.setGroupId(1001l);
couponInfo.setCreateTime(new SimpleDateFormat("yyyy-MM-dd").parse("2019-07-04"));
//couponInfo.setEndTime(new SimpleDateFormat("yyyy-MM-dd").parse("2018-19-10"));
couponInfo.setUserID(100001l);
couponInfo.setValue(18);
couponInfo.setStatus(1);
couponInfo.setIsValid(1);
couponInfo.setUpdateTime(new SimpleDateFormat("yyyy-MM-dd").parse("2019-07-04"));
drawCouponReq.setCouponInfo(couponInfo);
couponFacade.drawCoupon(drawCouponReq);
}
}
- 注:在测试时老是遇到空指针报错,一般都是bean未注入导致。
## 反射
在写测试类之余无意间看到了java的反射,于是进行了一个简单的再了解。简单来说,java反射就是在运行状态中,对于任何一个类,我们都可以知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。这种动态获取对象信息和调用对象方法的功能被我们称为**反射机制。**
对于java反射来说,尤为重要的一个类是class类,Class 类是在Java语言中定义一个特定类的实现。一个类的定义包含成员变量,成员方法,还有这个类实现的接口,以及这个类的父类。Class类的对象用于表示当前运行的 Java 应用程序中的类和接口。有兴趣可以自己阅读Class源码。下面是Class的构造方法
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190708191122874.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0lUU09LXzEyMw==,size_16,color_FFFFFF,t_70)
可以看到它的构造方法是私有的,所以我们无法自己生成一个Class对象。Class类的对象是在当各类被调入时,由 Java 虚拟机自动创建 Class 对象,或通过类装载器中的 defineClass 方法生成。 我们生成的对象都会有个字段记录该对象所属类在CLass类的对象的所在位置。可以把每个Class类的对象当做众多类的代理。而且在每个Class类对象中有会有字段记录他引用的这个类的类加载器。
觉得 https://www.cnblogs.com/yepei/p/5649276.html 这篇文章对反射的介绍特别好,容易理解。
进一步具体反射的使用可以参考 https://blog.csdn.net/lwl20140904/article/details/80163880