单例模式、泛型和反射的概念

####    获取系统当前时间
可以使用System.currentTimeMillis()方法获取系统当前时间,从1970年1月1日午夜开始,得到的是毫秒数

####    Calendar日历类
可以帮我们进行时间和年、月、日、时、分、秒、星期之类的字段进行转换的类

获取对象
    
    //得到日历对象(默认时间的是当前系统时间)
    Calendar c = Calendar.getInstance();     不是用new来创建(单例模式)

获取毫秒数

    c.getTimeInMillis()

获取各个字段

        //获取年份
        int year = c.get(Calendar.YEAR);
        //月份得到的是0-11
        int month = c.get(Calendar.MONTH);
        month+=1;
        //获取日期
        int date = c.get(Calendar.DATE);
        System.out.println(year+" "+month+" "+date);
        //获取小时(HOUR_OF_DAY表示24小时制,HOUR表示12小时制)
        int hour = c.get(Calendar.HOUR_OF_DAY);
        //分钟
        int minute = c.get(Calendar.MINUTE);
        int second = c.get(Calendar.SECOND);
        System.out.println(hour+":"+minute+":"+second);
        //获取星期
        int week = c.get(Calendar.DAY_OF_WEEK);
        System.out.println(week);

设置时间
    
    设置毫秒数
    c.setTimeInMillis(毫秒数)
    如:
    c.setTimeInMillis(System.currentTimeMillis());

    按字段设置
    c.set(Calendar.YEAR, 2012);

####    单例模式
可以实现同一个进程,下只有实例(只有一个对象),需要的条件:

    1、私有的构造方法
    //当有公开构造之后,我们不能保证会在哪里被new,也不能保证被new的次数
    private MyUtil(){}

    2、私有静态的当前类对象的引用
    private static MyUtil instance;  //默认为null

    3、公开的静态获取对象的方法
    //获取对象只能通过该方法获取
    public static MyUtil getInstance(){
        //如果第一次来获取insance的值为null
        if(null == instance){
            instance = new MyUtil(); 
        }
        return instance;
    }


####    Date类
可以表示一个瞬间(有格式)

    Date t = new Date(time);
####    时间格式化对象
SimpleDateFormat是一个以与语言环境有关的方式来格式化和解析日期的具体类

    SimpleDateFormat sf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss E");
    //format方法接收一个Date对象
    String str = sf.format(t);

####    Java泛型
泛型的标记符号:

    E    -    Element 元素
    T    -    Type 类型
    K    -    Key    键
    V    -    Value 值
    N    -    Number 数值类型
    ?    -    不确定类型(通配符)
注意基本数据类型要作为泛化参数时需要用包装类型
    
    int        -    Integer
    char     -    Character

    double    -     Double
    float    -    Float
    boolean    -    Boolean
    short    -    Short
    long    -    Long
    byte    -    Byte

####    ?通配符

    <? extends T>表示类型上界,表示可以接收该类型T或者T的子类
    <? super T>表示类型下界,表示参数化类型是T类或者是T的父类
<? extends T>不确定类型,虚拟机无法分配空间,一般是只能读取,不能设置内容(null除外)

    //接收的就是Man以及它的子类(不能设置只能读取)
    MyArrayList<? extends Man> list2  = new MyArrayList<Man>();

    //该类型或者其父类
    MyArrayList<? super Man> list3 = new MyArrayList<Man>();
####    泛型方法

    泛型方法在定义时,需要在返回值之前加上一个<T>,如
    public static <T> void test(T t){

    }
    
    public <T> T test(T t){

    }
####    Java反射
Java反射是可以让我们在运行时来操作类的方法、属性、父类、接口等,所有的Java文件都会被编译为.class文件,class文件最终会被ClassLoader加载到虚拟机中去执行,加载过程中每个class文件会自动生成对应的Class对象

####    Class对象的获取
    
        //基于类名.class获取Class实例
        Class<?> cls = Person.class;
        
        //使用对象的getClass方法获取
        Person p1 = new Person();
        Class<?> cls2 = p1.getClass();
        
        try {
            Class<?> cls3 = Class.forName("com.types.Person");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
####    方法调用

    //获取所有构造方法
    Constructor<?>[] constr = cls.getConstructors();

    //获取一个精确的构造
    Constructor<?> constructor = cls.getConstructor(String.class,int.class);
在反射的使用时如果要操作方法建议去掉Java语言环境的检测,通过以下方式去掉即可(对所有方法有效)
    
    constructor.setAccessible(true);
使用构造方法创建对象
    
    Person p = (Person) constructor.newInstance("张三",18);

    使用无参构造创建
    Person p2 = (Person) cls.newInstance();

####    获取方法(普通方法)

    获取本类中所有定义的方法包括private、public、protected、default
    Method[] ms = cls.getDeclaredMethods();

    //获取所有公开方法(包括父类中的公开方法直到Object)
    Method[] ms = cls.getMethods();

    //获取精确的方法 
    Method m = cls.getDeclaredMethod("wearClothes", String.class);
    m.setAccessible(true);
    //执行方法
    boolean r = (Boolean)m.invoke(p, "运动服");

####    属性操作

    //获取某一个精确的属性
    Field f = cls.getDeclaredField("name");
    //设置属性值
    f.setAccessible(true);
    f.set(p, "李四");
            
    //获取某一个精确的属性
    Field fa = cls.getDeclaredField("a");
    //设置属性值
    fa.setAccessible(true);
    fa.set(p, 100);
####    获取父类

    //获取父类(Object的父类是null)
    Class<?> superCls = cls.getSuperclass();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值