利用java的反射以及在java web反射机制的使用优化程序
2014-04-28 21:51
543 查看
开发java程序中我们都知道懂得java的反射机制可以优化我们的程序,在一定程序上减少代码的冗余性,当我在刚开始做java web的项目中没有用到ssh框架的时候,用servlet和jsp来完成项目的时候,那么我们一般一定会在servlet中定义多个请求(如:添加,删除,修改,查询这些基本的操作)来对应某个实体的多个操作,如果我们在多个servlet多次写重复的判断请求会增加代码的冗余性,冗余的情况,等会下面会举例子介绍,那么让我们来看看java反射的概念。
java的反射:通过百度百科我们可以知道java的反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;通过动态的获取信息以及动态调用对象方法的功能成为java语言的反射机制。我们可以简单的根据类或对象的局部信息获取类或对象的全部信息。
接着来一个java反射的机制例子:
第一步:先定义一个JavaBean(PersonBean),代码如下:
第二步:开始测试java的反射
那么接下来看看我在第一次做java web项目用servlet时的冗余代码,下面的冗余代码知识截个图做示例:
如果我们在每一个servlet都这样做的话就会增加程序的冗余性,完全没必要,这个时候就可以通过反射的机制来实现。
首先我们可以创建一个基本的servlet(BaseServlet)给所有的servlet继承,注意在创建servlet的时候,不用在web.xml有BaseServlet的映射。
我们写一个servlet(BookServlet2)测试一下:
这个BookServlet2在web.xml必须有映射关系,接着我们在浏览器输入http://127.0.0.1:8080/BookServer/BookServlet2?action=addBook的时候,效果如下:
我们在浏览器输入:http://127.0.0.1:8080/BookServer/BookServlet2?action=selectBook,效果如下:
所以说java的反射机制在java开发中有可以减少程序的冗余性和可读性,可维护性。
java的反射:通过百度百科我们可以知道java的反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;通过动态的获取信息以及动态调用对象方法的功能成为java语言的反射机制。我们可以简单的根据类或对象的局部信息获取类或对象的全部信息。
接着来一个java反射的机制例子:
第一步:先定义一个JavaBean(PersonBean),代码如下:
package com.test; public class PersonBean { private String name; private int age; public String nichen; public PersonBean() { super(); // TODO Auto-generated constructor stub } public PersonBean(String name, int age) { super(); this.name = name; this.age = age; System.out.println("名字为:"+name+",年龄为:"+age+"的人被创建了..."); } public String sayHelloWord(String name){ System.out.println(this.name+"对"+name+"说你好"); return "已经打完招呼"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
第二步:开始测试java的反射
package com.test; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ReflectDemo { /** * java的反射 */ public static void main(String[] args) { // TODO Auto-generated method stub try { //获得PersonBean的class对象 Class<?> clazz=Class.forName("com.test.PersonBean");//参数必须是类的完整名称(包名+类名) /**测试调用类的构造器,只能调用public权限的, * 要调用没有权限设置(不管private,protected,public)的构造器的话 * 可以通过getDeclaredConstructor()方法*/ Constructor cons= clazz.getConstructor(new Class[]{String.class,int.class});//得到有参数的类的构造器 Object obj= cons.newInstance("小明",12);//实例化类的PersonBean对象 /**************测试调用类的public权限的成员属性************************************/ Field field= clazz.getField("nichen"); PersonBean personBean=new PersonBean(); field.set(personBean, "我的昵称"); System.out.println(personBean.nichen); /****************接着测试铜鼓反射调用方法,下面的只能调用public权限的, * 如果调用没有权限设置(不管private,protected,public)方法的话通过getDeclaredMethod()*************/ Method method= clazz.getMethod("sayHelloWord", new Class[]{String.class});//得到类的方法 method.invoke(obj, "小华");//执行方法,会打印出"小明对小华说你好" } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }运行结果:
那么接下来看看我在第一次做java web项目用servlet时的冗余代码,下面的冗余代码知识截个图做示例:
如果我们在每一个servlet都这样做的话就会增加程序的冗余性,完全没必要,这个时候就可以通过反射的机制来实现。
首先我们可以创建一个基本的servlet(BaseServlet)给所有的servlet继承,注意在创建servlet的时候,不用在web.xml有BaseServlet的映射。
package com.book.controller; import java.io.IOException; import java.lang.reflect.Method; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class BaseServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try{ String action= request.getParameter("action");//得到请求的参数名 Class[] clazz=new Class[]{HttpServletRequest.class,HttpServletResponse.class}; Method method= this.getClass().getMethod(action, clazz); method.invoke(this, request,response);//执行相应的方法 }catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
我们写一个servlet(BookServlet2)测试一下:
package com.book.controller; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.book.constant.ErrorConstant; import com.book.constant.InfoConstant; import com.book.domain.BookInfo; import com.book.domain.Category; import com.book.domain.User; import com.book.service.BookServiceImpl; import com.book.service.UserServiceImpl; public class BookServlet2 extends BaseServlet { public void addBook(HttpServletRequest request,HttpServletResponse response){ System.out.println("添加书籍..."); } public void deleteBook(HttpServletRequest request,HttpServletResponse response){ System.out.println("删除书籍..."); } public void updateBook(HttpServletRequest request,HttpServletResponse response){ System.out.println("修改书籍..."); } public void selectBook(HttpServletRequest request,HttpServletResponse response){ System.out.println("查询书籍..."); } }
这个BookServlet2在web.xml必须有映射关系,接着我们在浏览器输入http://127.0.0.1:8080/BookServer/BookServlet2?action=addBook的时候,效果如下:
我们在浏览器输入:http://127.0.0.1:8080/BookServer/BookServlet2?action=selectBook,效果如下:
所以说java的反射机制在java开发中有可以减少程序的冗余性和可读性,可维护性。
相关文章推荐
- 利用反射机制来获取表单请求值以及对象赋值(使用了第三方插件)
- Java使用反射机制优化工厂方法
- 如何使用Java的反射机制以及调用构造方法?
- java 利用反射机制的刀实体类的属性以及对属性操作
- Java使用反射机制优化工厂方法
- java中的类的反射机制以及经典实例
- Java中的反射机制 利用反射访问私有
- 使用java的反射机制
- Java基础:JAVA程序类加载及其反射机制
- 利用Java的反射与代理机制实现AOP
- Java中的反射机制 一个利用反射进行对象拷贝的例子
- 深入理解java虚拟机(十三) Java 即时编译器JIT机制以及编译优化
- kettle job如何利用java的反射机制获取执行的sql语句
- Java反射高级应用--利用反射调用类的私有方法修改私有方法值,以及替换Java的类成员数据
- java反射,类加载器以及配置文件的结合使用
- Java程序优化--如何更高效地使用字符串。
- java 去除空行程序 以及set接口的使用特征
- Java高并发程序-Chapter5 锁的优化及注意事项(第三十三讲)无锁 - 无锁类的使用
- 利用反射机制来获取表单请求值以及对象赋值
- java 利用泛性和反射机制实现collections.sort排序模板