开启掘金成长之旅!这是我参与「掘金日新计划 · 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 对象获取到。