版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DTJ_74/article/details/52525269
平时常将CRUD的数据库操作抽出来,那么反射机制获取实例这个就比较应用广泛了。
直接上代码。
定义一个IBaseDao接口。
package com.reflect.pro3;
public interface IBaseDao<T> {
void save(T t);
void saveOrUpdate(T t);
void delete(T t);
void update(T t);
}
有接口,当然就有实现类了。
package com.reflect.pro3;
import java.lang.reflect.ParameterizedType;
@SuppressWarnings("unchecked")
public class BaseDao<T> implements IBaseDao<T> {
protected Class<T> entityClass;
public BaseDao() {
}
protected Class<T> getEntityClass() {
if (entityClass == null) {
// getClass().getGenericSuperclass()返回表示此 Class 所表示的实体(类、接口、基本类型或
// void)的直接超类的 Type
entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass())
.getActualTypeArguments()[0];
}
return entityClass;
}
@Override
public void save(T t) {
// TODO Auto-generated method stub
System.out.println("save" + t);
}
@Override
public void saveOrUpdate(T t) {
// TODO Auto-generated method stub
System.out.println("saveOrUpdate" + t);
}
@Override
public void delete(T t) {
// TODO Auto-generated method stub
System.out.println("delete" + t);
}
@Override
public void update(T t) {
// TODO Auto-generated method stub
System.out.println("update" + t);
}
}
实现·类里面已经写好增删改差操作。
但系由于不知道是什么类型的javabean,直接用泛型写。方便扩充。
举个例子:
定义一个LoginEntity的javabean类。进行测试。
package com.reflect.pro3;
public class LoginEntity {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public LoginEntity() {
super();
}
public LoginEntity(String username, String password) {
super();
this.username = username;
this.password = password;
}
@Override
public String toString() {
return "LoginEntity [username=" + username + ", password=" + password + "]";
}
}
上面直接重写toString方法,方便等下的输出。
定义一个ILoginDao 接口。并且实现IBaseDao接口。为啥这么做,这么做可以呢?接口的继承,实现更多的方法。也可以扩充这里的ILoginDao方法。java多态的体现。
package com.reflect.pro3;
public interface ILoginDao extends IBaseDao<LoginEntity> {
//日后扩充不同的需求。
}
有接口肯定就有实现类。
package com.reflect.pro3;
public class LoginDao extends BaseDao<LoginEntity> implements ILoginDao {
}
这里只要继承了BaseDao类实现ILoginDao接口,那么就有了对应的方法了。
最后写个测试类。
package com.reflect.pro3;
public class TestLoginPro {
public static void main(String[] args) {
ILoginDao iLoginDao = new LoginDao();
LoginEntity entity = new LoginEntity("tanweicheng", "123456");
iLoginDao.save(entity);
iLoginDao.delete(entity);
iLoginDao.saveOrUpdate(entity);
iLoginDao.delete(entity);
}
}
运行结果:
saveLoginEntity [username=tanweicheng, password=123456]
deleteLoginEntity [username=tanweicheng, password=123456]
saveOrUpdateLoginEntity [username=tanweicheng, password=123456]
deleteLoginEntity [username=tanweicheng, password=123456]
这个·就是反射机制的应用,通过发射获取对应的对象。这么做就将相同的CRUD部分抽出来了,简单了。