java反射|fastjson|lombok|Test|

278 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 13 天,点击查看活动详情

摘要

如果一个方法中它的if语句特别的多,如果它有100个if语句,那么我是不是要写100个if语句的判断呢?很显然,如果这么写的话,可定不是一个好的方法。在java中有一个叫做反射的概念,就是通过获取到这个类的所有方法,然后根据根据参数自动的获取到这个方法,并且执行这个方法。

反射解决if语句过多的问题

如下代码:

        String mName= req.getParameter("m");

        //第一种方法
//        if(mName.equals("addCourse")){
//
//            //添加课程的方法
//            addCourse(req,resp);
//        }else if(mName.equals("deleteCourse")){
//
//            deleteCourse(req,resp);
//        }

        //第二种方法
        //反射解决通过参数的不同执行不同的方法
        if(mName!=null){
            Class c=this.getClass();
            try {

                Method method=
                        c.getMethod(mName,HttpServletRequest.class,HttpServletResponse.class);//参数类
                method.invoke(this,req,resp);

            } catch (Exception e) { //设置了一个大的异常
                e.printStackTrace();
            }
        }

反射部分可以做通用类

我们把公共部分给父级,那么子级就只要继承这个父级就有父级的方法。

所以我们创建一个通用的类为 BaseServlet如下:

反射的方法写在了这个通用的父类里边,以后只要继承这个父类的都会有这个方法。

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


        System.out.println("into servlet test");

        String mName= req.getParameter("m");

        //第一种方法
//        if(mName.equals("addCourse")){
//
//            //添加课程的方法
//            addCourse(req,resp);
//        }else if(mName.equals("deleteCourse")){
//
//            deleteCourse(req,resp);
//        }

        //第二种方法
        //反射解决通过参数的不同执行不同的方法
        if(mName!=null){
            Class c=this.getClass();
            try {

                Method method=
                        c.getMethod(mName,HttpServletRequest.class,HttpServletResponse.class);//参数类
                method.invoke(this,req,resp);

            } catch (Exception e) { //设置了一个大的异常
                e.printStackTrace();
            }
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }

其他的servlet里边就是单纯的业务代码,如下:

@WebServlet("/test")
public class ServletTest extends BaseServlet {


    //增加课程的方法
    public void addCourse(HttpServletRequest req,HttpServletResponse resp){
        System.out.println("addCourse....");
    }

    //删除课程的方法
    public void deleteCourse(HttpServletRequest req,HttpServletResponse resp){
        System.out.println("删除课程的方法....");
    }

}

fastjson 解析

作用

前端使用json的方式是很普遍的,而且json利于阅读和传输。那么在java中是如何使用json的呢?

首先,需要用fastjson的依赖包。

然后java中的一个类对象就是一个json,且json的key值就是类对象的属性。

也就是java中把json对象编程字符串就是把类对象编程字符串。

类对象和集合转变成json字符串

实体类 作为对象 转化成JSON字符串

如下代码和输出结果:

    public static void main(String[] args) {
        Person p1=new Person("小明",30, DateUtils.getDateFormart());

        String p1JsonString=JSON.toJSONString(p1);

        System.out.println(p1JsonString);
    }

输出结果:

集合转换成JSON字符串

如下代码和输出的截图:

        Person p2=new Person("小红",30, DateUtils.getDateFormart());
        Person p3=new Person("小张",31, DateUtils.getDateFormart());
        Person p4=new Person("小兵",34, DateUtils.getDateFormart());

        List<Person> list=new ArrayList<>();
        //统一添加多个对象的方法
        Collections.addAll(list,p2,p3,p4);
        String listString=JSON.toJSONString(list);
        System.out.println(listString);

输出的结果是:

重点:JSONField注解

主要目标是实现以下几种情况,一个是我输出的json字符串的属性名是否可以更改,输出的顺序,还有就是对象内的某一些属性可以不在json字符串里边吗。

如下代码实现了以上集中情况:

   /*
    * name属性是修改json对象显示的属性
    * ordinal排序,就是json对象中显示的顺序
    * serialize这个属性在json对象中是否显示
    * */
    @JSONField(name="user_name",ordinal = 1)
    private String username;
    @JSONField(name="user_name",ordinal = 2)
    private int age;
    @JSONField(name="user_name",serialize = false)
    private String birthdate;

json字符串转成java对象和集合

解析成java对象

        String j1="{"user_name":"小明","_age":30}";
        String listJ1="[{"user_name":"小红","_age":30},{"user_name":"小张","_age":31},{"user_name":"小兵","_age":34}]";

        //转成对象
        Person p1=JSON.parseObject(j1,Person.class);

解析成集合

String listJ1="[{"user_name":"小红","_age":30},{"user_name":"小张","_age":31},{"user_name":"小兵","_age":34}]";

//转成集合
List<Person> list=JSON.parseArray(listJ1,Person.class);

System.out.println(p1);
System.out.println(list);

lombok的使用

在java的实体中如果使用lombok,那么可以不需要写getter setter 构造方法等方法。

如果需要有全参的构造方法,那么需要多添加一个修饰器。

如下代码,就是全参的修饰器:

@Data
@AllArgsConstructor
public class Person {
    
    private String username;
    private int age;
    private String birthdate;
    
}

Test的使用

在方法上边加行注解,那么这个方法就具备测试的权利

需要注意的是:在pom.xml上是需要安装这个测试的依赖的,切记作用域不要限制在test范围内,如果限制在这个范围内,那么就只能够在测试文件里边才会获取到依赖。

如下代码

    @Test
    public void objectToJsonString(){

        Person p1=new Person("小明",30, DateUtils.getDateFormart());

        String p1JsonString=JSON.toJSONString(p1);

        System.out.println(p1JsonString);

    }

总结

反射必定离不开 Class 对象。都知道,代码编写完后是要编译成 .class 文件的。这里的一个个 .class 文件,被虚拟机加载到内存后就是以 Class 对象存在,一个类只能有一个 .class 文件,因此,一个类也就对应一个 Class 对象,Class 对象是类的描述信息,比如:字段、方法、注释等等等等,只要你想得到的类结构,他在 Class 对象内都有体现,并且都能通过 Class 对象获取到。