背景:创建一个BaseDao爽一下
为什么用泛型?
泛型取代了xml,不用为数据库和bean的名称不匹配烦恼了
BaseDao《T》来了
import java.lang.annotation.Annotation;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class BaseDao<T>{
public BaseDao() {
/*
* this.getclass 得到子类的类型
* getGeneicsuperclass得到type类型对象,强制转换成实现类paramaterizedtype.得到例如T<String ,Integer>
* 通过getactualtypearguments[]方法的到数组,里边存放泛型 的<>的内容.0表示第一个参数String,1表示Integer
*
* */
/*
* 这段代码相当于下边的到类的过程。
* Class clazz=this.getClass();
ParameterizedType type=(ParameterizedType) clazz.getGenericSuperclass();
Class c= (Class) type.getActualTypeArguments()[0];
System.out.println(c.getName());
*/
Class beanclass=(Class)((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
//打印所得到class的类型名称
System.out.println(beanclass.getName());
try {
//通过class类中的getmethod得到指定名称的方法:beanclass.getMethod("put")
System.out.println(beanclass.getMethod("put"));
} catch (NoSuchMethodException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (SecurityException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
//得到类上指定类型的注解
anno1 a=(anno1) beanclass.getAnnotation(anno1.class);
//打印注解的值
System.out.println("注解的值"+a.value());
}
}
StringBao来了
public class StringDao extends BaseDao<User>{
public static void main(String[] args) {
StringDao dao=new StringDao();
}
}
这是添加了注解User
import java.util.Date;
@anno1("nihao")
public class User {
private String name;
private Date logintime;
private String sessionid;
private String ip;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getLogintime() {
return logintime;
}
public void setLogintime(Date logintime) {
this.logintime = logintime;
}
public String getSessionid() {
return sessionid;
}
public void setSessionid(String sessionid) {
this.sessionid = sessionid;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public void put() {}
@Override
public String toString() {
return "User [name=" + name + ", logintime=" + logintime + ", sessionid=" + sessionid + ", ip=" + ip + "]";
}
}
注解类anno1:
要注意了,这个注解的作用域必须是runtime
不然反射不到,jvm加载不进去的。
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface anno1 {
String value();
}
注:初学者记个笔记分享一下,如有理解错误的地方,或者疑问可以一块讨论.