Java学习笔记-反射

Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,也有称作“自省”。反射非常强大,它甚至能直接操作程序的私有属性。反射就像一面镜子,它可以在运行时获取一个类的所有信息,可以获取到任何定义的信息(包括成员变量,成员方法,构造器等),并且可以操纵类的字段、方法、构造器等部分。

  • 获取字节码对象 

 Class.forName(“类的全路径”);

类名.class

对象.getClass();

 

/*测试暴力反射物料*/
public class Person {
    private  String name;
    private  int age;

    private  void  save(int n ,String s){
        System.out.println("保存");
    }

    private void  update(){
        System.out.println("更新");
    }
}



import org.junit.Test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/*测试暴力反射*/
public class TetstReflect2 {
    @Test
    public void getFie() throws Exception {
        //获取字节码对象
        Class<Person> clazz = Person.class;
        //获取指定的私有属性
        Field df = clazz.getDeclaredField("name");
        System.out.println(df);
        System.out.println(df.getType());
        //获取私有属性的类型
        System.out.println(df.getType().getName());
        //设置获取到的字段对象的属性值
        Object o = clazz.newInstance();
        //设置私有可见的权限
        df.setAccessible(true);
        df.set(o,"张三");//设置属性值
        System.out.println(df.get(o) );//获取属性值


    }
    @Test
    public void getFie2() throws Exception {
        //获取字节码对象
        Class<?>  clazz = Person.class;
       //获取私有属性age
        Field df = clazz.getDeclaredField("age");
        //通过字节码对象创建对象
        Object o = clazz.newInstance();
        //设置私有属性可见权限
        df.setAccessible(true);
        df.set(o,35);
        System.out.println(df.get(o) );

    }

    //测试暴力反射技术获取并执行私有方法
    @Test
    public void getFun() throws Exception {
        //获取字节码对象
        Class<?>  clazz = Person.class;
        //获取指定方法
        Method m = clazz.getDeclaredMethod("save", int.class, String.class);
        //通过反射技术创建对象
        Object o = clazz.newInstance();
        //获取是有方法可见权限
        m.setAccessible(true);
        /*通过反射技术给对应的对象执行对应的方法invoke(o,x,y,z...)
        * o为指定对象,x,y,z....方法的传入参数*/
        m.invoke(o,66,"测试");
    }
    @Test
    public void getFun2() throws Exception{
        //1.获取字节码对象
        Class<Person> clazz = Person.class;
        //通过字节码对象获取指定方法
        Method m = clazz.getDeclaredMethod("update");
        //获取执行私有方法权限
        m.setAccessible(true);
        //创建对象
        Person o = clazz.newInstance();
        //执行方法
        m.invoke(o);
    }
}

日期转换工具类SimpleDateFormat



public class TestDate {
    public static void main(String[] args) throws ParseException {
        Date d1 = new Date();
        System.out.println(d1);
        DateUtils du = new DateUtils();
        String s = du.dateToString("yyyy年MM月dd日 hh:mm:ss", d1);
        System.out.println(s);

        Date d2 = du.stringToDate(s, "yyyy年MM月dd日 hh:mm:ss");
        System.out.println(d2);
    }
}



public class DateUtils {
    public  String dateToString(String format, Date d){
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        String s1 = sdf.format(d);
        return s1;
    }
    public  Date stringToDate(String s,String format) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        Date d1 = sdf.parse(s);
        return d1;
    }

}


import java.text.SimpleDateFormat;
import java.util.Date;

//测试日期转换工具类
public class TestSimpleDateFromat {
    public static void main(String[] args) {
        //创建日期类对象
        Date d1 = new Date();
        Date d2 = new Date();
        //创建日期类转换工具
        SimpleDateFormat sdf = new SimpleDateFormat();
        String s1 = sdf.format(d1);//通过转换工具转换日期
        System.out.println(s1);

        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
        String s2 = sdf1.format(d2);
        System.out.println(s2);
        System.out.println(d1.getTime());//获取从标准基准时间到现在时间的毫秒值
        System.out.println(d1.getTime()/1000/60/60/24/365);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值