泛型,反射,注解实现BaseDao先行技术基础

背景:创建一个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();

}

注:初学者记个笔记分享一下,如有理解错误的地方,或者疑问可以一块讨论.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值