Java反射机制初涉

一、什么是反射机制    
        简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,   
    那么就可以通过反射机制来获得类的所有信息。   
二、哪里用到反射机制    
        有些时候,我们用过一些知识,但是并不知道它的专业术语是什么,在刚刚学jdbc时用过一行代码,
    Class.forName("com.mysql.jdbc.Driver.class").newInstance();但是那时候只知道那行代码是生成   
    驱动对象实例,并不知道它的具体含义。听了反射机制这节课后,才知道,原来这就是反射,现在很多开   
    框架都用到反射机制,hibernate、struts都是用反射机制实现的。   
三、反射机制的优点与缺点    
        为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念,   
    静态编译:在编译时确定类型,绑定对象,即通过。   
    动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多   
    态的应用,有以降低类之间的藕合性。   
    一句话,反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中   
    它的灵活性就表现的十分明显。比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程序编   
    译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如   
    这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能   
    的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功   
    能。   
       它的缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它   
    满足我们的要求。这类操作总是慢于只直接执行相同的操作。   
四、利用反射机制能获得什么信息    
         一句话,类中有什么信息,它就可以获得什么信息,不过前提是得知道类的名字,要不就没有后文了   
    首先得根据传入的类的全名来创建Class对象。   
    Class c=Class.forName("className");注明:className必须为全名,也就是得包含包名,比如,cn.netjava.pojo.UserInfo;   
    Object obj=c.newInstance();//创建对象的实例   
    OK,有了对象就什么都好办了,想要什么信息就有什么信息了。  
    获得构造函数的方法   
    Constructor getConstructor(Class[] params)//根据指定参数获得public构造器

    Constructor[] getConstructors()//获得public的所有构造器

    Constructor getDeclaredConstructor(Class[] params)//根据指定参数获得public和非public的构造器

    Constructor[] getDeclaredConstructors()//获得public的所有构造器  
    获得类方法的方法   
    Method getMethod(String name, Class[] params),根据方法名,参数类型获得方法

    Method[] getMethods()//获得所有的public方法

    Method getDeclaredMethod(String name, Class[] params)//根据方法名和参数类型,获得public和非public的方法

    Method[] getDeclaredMethods()//获得所以的public和非public方法  
    获得类中属性的方法   
    Field getField(String name)//根据变量名得到相应的public变量

    Field[] getFields()//获得类中所以public的方法

    Field getDeclaredField(String name)//根据方法名获得public和非public变量

    Field[] getDeclaredFields()//获得类中所有的public和非public方法  
    常用的就这些,知道这些,其他的都好办……   
五、用反射机制能干什么事    
        刚开始在使用jdbc时侯,在编写访问数据库时写到想吐,有八个表,每个表都有增删改查中操作   
    那时候还不知道有反射机制这个概念,所以就对不同的表创建不同的dao类,这样不仅开发速率地,而且代码   
    冗余的厉害,最要命的是看着差不多的,然后直接复制修改,由于容易犯各种低级的错误(大小写啊,多一   
    个或少一个字母啊……),一个错误就可以让你找半天。   
        有了java反射机制,什么都好办了,只需要写一个dao类,四个方法,增删改查,传入不同的对象,就OK啦,   
    无需为每一个表都创建dao类,反射机制会自动帮我们完成剩下的事情,这就是它的好处。说白了,反射机制就是专门   
    帮我们做那些重复的有规则的事情,所以现在很多的自动生成代码的软件就是运用反射机制来完成的,只要你按照规则   
    输入相关的参数,所以低级的程序员慢慢的就被抹杀了,为什么?因为代码都不用写了,随便一个人都会开发,还要程   
    序员干什么啊?所以我们只有一条出路,那就是努力努力再努力,成为高级程序员,专门开发傻瓜软件,让其他程序员  到 一边凉快去,呵呵~   
六、用反射机制实现对数据库数据的增、查例子    
    基本原理;保存数据时,把需要保存的对象的属性值全部取出来再拼凑sql语句   
                 查询时,将查询到的数据全部包装成一个java对象。   
    游戏规则:俗话说的好,无规矩不成方圆,特别是程序来说,它只能做有规则的事情,没有规则的它干不了,好,那就   
              先定规则   
              1)数据库的每一个表对象一个pojo类,表中的每一个字段对应pojo类的中的一个属性。   
                 并且pojo类的名字和表的名字相同,属性名和字段名相同,大小写没有关系,因为数据库一般不区分大小写 
              2)为pojo类中的每一个属性添加标准的set和get方法。   
    有了游戏规则,那么开始游戏吧。

1、首先数据库的有一个表,假设数据库名称为:blogsystem,里面的一个表名userinfo。如图:

2、创建对应的pojo类:

  1. package cn.netjava.pojo;  
  2.   
  3.    
  4.   
  5. public class UserInfo {  
  6.   
  7. private int id;  
  8.   
  9. private String name;  
  10.   
  11. private String pwd;  
  12.   
  13. private int age;  
  14.   
  15.    
  16.   
  17. @Override  
  18.   
  19. public String toString() {  
  20.   
  21.     return "UserInfo [id=" + id + ", name=" + name + ", pwd=" + pwd + ", age="  
  22.   
  23.             + age + "]";  
  24.   
  25. }  
  26.   
  27. public int getId() {  
  28.   
  29.     return id;  
  30.   
  31. }  
  32.   
  33. public void setId(int id) {  
  34.   
  35.     this.id = id;  
  36.   
  37. }  
  38.   
  39. public String getName() {  
  40.   
  41.     return name;  
  42.   
  43. }  
  44.   
  45. public void setName(String name) {  
  46.   
  47.     this.name = name;  
  48.   
  49. }  
  50.   
  51. public String getPwd() {  
  52.   
  53.     return pwd;  
  54.   
  55. }  
  56.   
  57. public void setPwd(String pwd) {  
  58.   
  59.     this.pwd = pwd;  
  60.   
  61. }  
  62.   
  63. public int getAge() {  
  64.   
  65.     return age;  
  66.   
  67. }  
  68.   
  69. public void setAge(int age) {  
  70.   
  71.     this.age = age;  
  72.   
  73. }  
  74.   
  75.    
  76.   
  77. }  

 
2、编写获得数据库连接的工厂类:
  1. package cn.netjava.factory;  
  2.   
  3.    
  4.   
  5. import java.sql.Connection;  
  6.   
  7. import java.sql.DriverManager;  
  8.   
  9.    
  10.   
  11. public class Connect2DBFactory {  
  12.   
  13.     public static Connection getDBConnection() {  
  14.   
  15.         Connection conn = null;  
  16.   
  17.         try {  
  18.   
  19.             Class.forName("com.mysql.jdbc.Driver");  
  20.   
  21.             String url = "jdbc:mysql://localhost:3306/blogsystem";  
  22.   
  23.             String user = "root";  
  24.   
  25.             String password = "netjava";  
  26.   
  27.             conn = DriverManager.getConnection(url, user, password);  
  28.   
  29.         } catch (Exception e) {  
  30.   
  31.             e.printStackTrace();  
  32.   
  33.         }  
  34.   
  35.    
  36.   
  37.         return conn;  
  38.   
  39.     }  
  40.   
  41. }  

 

3、好戏开始啦,编写操作数据库的dao类

  1. package cn.netjava.session;  
  2.   
  3.    
  4.   
  5. import java.lang.reflect.Field;  
  6.   
  7. import java.lang.reflect.Method;  
  8.   
  9. import java.sql.Connection;  
  10.   
  11. import java.sql.PreparedStatement;  
  12.   
  13. import java.sql.ResultSet;  
  14.   
  15. import java.sql.SQLException;  
  16.   
  17. import java.sql.Statement;  
  18.   
  19. import java.util.ArrayList;  
  20.   
  21. import java.util.List;  
  22.   
  23.    
  24.   
  25. import cn.netjava.factory.Connect2DBFactory;  
  26.   
  27. import cn.netjava.pojo.UserInfo;  
  28.   
  29.    
  30.   
  31. public class NetJavaSession {  
  32.   
  33.     /** 
  34.  
  35.      * 解析出保存对象的sql语句 
  36.  
  37.      * 
  38.  
  39.      * @param object 
  40.  
  41.      *            :需要保存的对象 
  42.  
  43.      * @return:保存对象的sql语句 
  44.  
  45.      */  
  46.   
  47.     public static String getSaveObjectSql(Object object) {  
  48.   
  49.         // 定义一个sql字符串  
  50.   
  51.         String sql = "insert into ";  
  52.   
  53.         // 得到对象的类  
  54.   
  55.         Class c = object.getClass();  
  56.   
  57.         // 得到对象中所有的方法  
  58.   
  59.         Method[] methods = c.getMethods();  
  60.   
  61.         // 得到对象中所有的属性  
  62.   
  63.         Field[] fields = c.getFields();  
  64.   
  65.         // 得到对象类的名字  
  66.   
  67.         String cName = c.getName();  
  68.   
  69.         // 从类的名字中解析出表名  
  70.   
  71.         String tableName = cName.substring(cName.lastIndexOf(".") + 1,  
  72.   
  73.                 cName.length());  
  74.   
  75.         sql += tableName + "(";  
  76.   
  77.         List<String> mList = new ArrayList<String>();  
  78.   
  79.         List vList = new ArrayList();  
  80.   
  81.         for (Method method : methods) {  
  82.   
  83.             String mName = method.getName();  
  84.   
  85.             if (mName.startsWith("get") && !mName.startsWith("getClass")) {  
  86.   
  87.                 String fieldName = mName.substring(3, mName.length());  
  88.   
  89.                 mList.add(fieldName);  
  90.   
  91.                 System.out.println("字段名字----->" + fieldName);  
  92.   
  93.                 try {  
  94.   
  95.                     Object value = method.invoke(object, null);  
  96.   
  97.                     System.out.println("执行方法返回的值:" + value);  
  98.   
  99.                     if (value instanceof String) {  
  100.   
  101.                         vList.add("\"" + value + "\"");  
  102.   
  103.                         System.out.println("字段值------>" + value);  
  104.   
  105.                     } else {  
  106.   
  107.                         vList.add(value);  
  108.   
  109.                     }  
  110.   
  111.                 } catch (Exception e) {  
  112.   
  113.                     e.printStackTrace();  
  114.   
  115.                 }  
  116.   
  117.             }  
  118.   
  119.         }  
  120.   
  121.         for (int i = 0; i < mList.size(); i++) {  
  122.   
  123.             if (i < mList.size() - 1) {  
  124.   
  125.                 sql += mList.get(i) + ",";  
  126.   
  127.             } else {  
  128.   
  129.                 sql += mList.get(i) + ") values(";  
  130.   
  131.             }  
  132.   
  133.         }  
  134.   
  135.         for (int i = 0; i < vList.size(); i++) {  
  136.   
  137.             if (i < vList.size() - 1) {  
  138.   
  139.                 sql += vList.get(i) + ",";  
  140.   
  141.             } else {  
  142.   
  143.                 sql += vList.get(i) + ")";  
  144.   
  145.             }  
  146.   
  147.         }  
  148.   
  149.    
  150.   
  151.         return sql;  
  152.   
  153.     }  
  154.   
  155.    
  156.   
  157.     public static List getDatasFromDB(String tableName, int Id) {  
  158.   
  159.    
  160.   
  161.         return null;  
  162.   
  163.    
  164.   
  165.     }  
  166.   
  167.    
  168.   
  169.     /** 
  170.  
  171.      * 将对象保存到数据库中 
  172.  
  173.      * 
  174.  
  175.      * @param object 
  176.  
  177.      *            :需要保存的对象 
  178.  
  179.      * @return:方法执行的结果;1:表示成功,0:表示失败 
  180.  
  181.      */  
  182.   
  183.     public int saveObject(Object object) {  
  184.   
  185.         Connection con = Connect2DBFactory.getDBConnection();  
  186.   
  187.         String sql = getSaveObjectSql(object);  
  188.   
  189.         try {  
  190.   
  191.             // Statement statement=(Statement) con.createStatement();  
  192.   
  193.             PreparedStatement psmt = con.prepareStatement(sql);  
  194.   
  195.             psmt.executeUpdate();  
  196.   
  197.             return 1;  
  198.   
  199.         } catch (SQLException e) {  
  200.   
  201.             e.printStackTrace();  
  202.   
  203.             return 0;  
  204.   
  205.         }  
  206.   
  207.     }  
  208.   
  209.    
  210.   
  211.     /** 
  212.  
  213.      * 从数据库中取得对象 
  214.  
  215.      * 
  216.  
  217.      * @param arg0 
  218.  
  219.      *            :对象所属的类 
  220.  
  221.      * @param id 
  222.  
  223.      *            :对象的id 
  224.  
  225.      * @return:需要查找的对象 
  226.  
  227.      */  
  228.   
  229.     public Object getObject(String className, int Id) {  
  230.   
  231.         // 得到表名字  
  232.   
  233.         String tableName = className.substring(className.lastIndexOf(".") + 1,  
  234.   
  235.                 className.length());  
  236.   
  237.         // 根据类名来创建Class对象  
  238.   
  239.         Class c = null;  
  240.   
  241.         try {  
  242.   
  243.             c = Class.forName(className);  
  244.   
  245.    
  246.   
  247.         } catch (ClassNotFoundException e1) {  
  248.   
  249.    
  250.   
  251.             e1.printStackTrace();  
  252.   
  253.         }  
  254.   
  255.         // 拼凑查询sql语句  
  256.   
  257.         String sql = "select * from " + tableName + " where Id=" + Id;  
  258.   
  259.         System.out.println("查找sql语句:" + sql);  
  260.   
  261.         // 获得数据库链接  
  262.   
  263.         Connection con = Connect2DBFactory.getDBConnection();  
  264.   
  265.         // 创建类的实例  
  266.   
  267.         Object obj = null;  
  268.   
  269.         try {  
  270.   
  271.    
  272.   
  273.             Statement stm = con.createStatement();  
  274.   
  275.             // 得到执行查寻语句返回的结果集  
  276.   
  277.             ResultSet set = stm.executeQuery(sql);  
  278.   
  279.             // 得到对象的方法数组  
  280.   
  281.             Method[] methods = c.getMethods();  
  282.   
  283.             // 遍历结果集  
  284.   
  285.             while (set.next()) {  
  286.   
  287.                 obj = c.newInstance();  
  288.   
  289.                 // 遍历对象的方法  
  290.   
  291.                 for (Method method : methods) {  
  292.   
  293.                     String methodName = method.getName();  
  294.   
  295.                     // 如果对象的方法以set开头  
  296.   
  297.                     if (methodName.startsWith("set")) {  
  298.   
  299.                         // 根据方法名字得到数据表格中字段的名字  
  300.   
  301.                         String columnName = methodName.substring(3,  
  302.   
  303.                                 methodName.length());  
  304.   
  305.                         // 得到方法的参数类型  
  306.   
  307.                         Class[] parmts = method.getParameterTypes();  
  308.   
  309.                         if (parmts[0] == String.class) {  
  310.   
  311.                             // 如果参数为String类型,则从结果集中按照列名取得对应的值,并且执行改set方法  
  312.   
  313.                             method.invoke(obj, set.getString(columnName));  
  314.   
  315.                         }  
  316.   
  317.                         if (parmts[0] == int.class) {  
  318.   
  319.                             method.invoke(obj, set.getInt(columnName));  
  320.   
  321.                         }  
  322.   
  323.                     }  
  324.   
  325.    
  326.   
  327.                 }  
  328.   
  329.             }  
  330.   
  331.    
  332.   
  333.         } catch (Exception e) {  
  334.   
  335.             e.printStackTrace();  
  336.   
  337.         }  
  338.   
  339.         return obj;  
  340.   
  341.     }  
  342.   
  343. }  

 

4、开始测试效果怎么样:

  1. package cn.netjava.tester;  
  2.   
  3.    
  4.   
  5. import cn.netjava.pojo.UserInfo;  
  6.   
  7. import cn.netjava.session.NetJavaSession;  
  8.   
  9.    
  10.   
  11. public class Tester {  
  12.   
  13.     public static void main(String args[]) {  
  14.   
  15.         //获得NetJavaSession对象  
  16.   
  17.         NetJavaSession session = new NetJavaSession();  
  18.   
  19.         //创建一个UserInfo对象  
  20.   
  21.         UserInfo user = new UserInfo();  
  22.   
  23.         //设置对象的属性  
  24.   
  25.         user.setId(6988);  
  26.   
  27.         user.setAge(44);  
  28.   
  29.         user.setPwd("pwd");  
  30.   
  31.         user.setName("champion");  
  32.   
  33.         //将对象保存到数据库中  
  34.   
  35.         String sql = session.getSaveObjectSql(user);  
  36.   
  37.         System.out.println("保存对象的sql语句:" + sql);  
  38.   
  39.         //查找对象  
  40.   
  41.         UserInfo userInfo = (UserInfo) session.getObject(  
  42.   
  43.                 "cn.netjava.pojo.UserInfo"6988);  
  44.   
  45.         System.out.println("获取到的信息:" + userInfo);  
  46.   
  47.    
  48.   
  49.     }  
  50.   
  51. }  

 

5、打印出来的结果:

 

下面是一个很好的例子:

 

编写Java反射程序的步骤:
  1)必须首先获取一个类的Class对象
  例如:
  Class c1 = Test.class;
  Class c2 = Class.forName(“com.reflection.Test”);
  Class c3 = new Test().getClass();
  2)然后分别调用Class对象中的方法来获取一个类的属性/方法/构造方法的结构
  注意:如果要能够正常的获取类中方法/属性/构造方法应该重点掌握如下的反射类
  Field
  Constructor
  Method
  示例:此程序例子告诉大家如何操作Class/Field/Constructor/Method等与Java反射相关的类
  

  1. package com.reflection;  
  2.   import java.lang.reflect.Constructor;  
  3.   import java.lang.reflect.Field;  
  4.   import java.lang.reflect.InvocationTargetException;  
  5.   import java.lang.reflect.Method;  
  6.   import java.lang.reflect.Modifier;  
  7.   public class TestReflection {  
  8.   private String username;  
  9.   private String password;  
  10.   private int[] age;  
  11.   public void setUserName(String username) {  
  12.   this.username = username;  
  13.   }  
  14.   private void setPassWord(String password) {  
  15.   this.password = password;  
  16.   }  
  17.   public static void test01() throws ClassNotFoundException {  
  18.   Class c1 = TestReflection.class;  
  19.   Class c2 = Class.forName("com.reflection.TestReflection");  
  20.   //获取指定的包名  
  21.   String package01 = c1.getPackage().getName();  
  22.   String package02 = c2.getPackage().getName();  
  23.   System.out.println("package01 = " + package01);  
  24.   System.out.println("package02 = " + package02);  
  25.   //获取类的修饰符  
  26.   int mod = c1.getModifiers();  
  27.   String modifier = Modifier.toString(mod);  
  28.   System.out.println("modifier = " + modifier);  
  29.   //获取指定类的完全限定名  
  30.   String className = c1.getName();  
  31.   System.out.println("className = " + className);  
  32.   //获取指定类的父类  
  33.   Class superClazz = c1.getSuperclass();  
  34.   String superClazzName = superClazz.getName();  
  35.   System.out.println("superClazzName = " + superClazzName);  
  36.   //获取实现的接口  
  37.   Class[] interfaces = c1.getInterfaces();  
  38.   for (Class t : interfaces) {  
  39.   System.out.println("interfacesName = " + t.getName());  
  40.   }  
  41.   //获取指定类的成员变量  
  42.   Field[] fields = c1.getDeclaredFields();  
  43.   for (Field field : fields) {  
  44.   modifier = Modifier.toString(field.getModifiers()); //获取每个  
  45.   字段的访问修饰符  
  46.   Class type = field.getType(); //获取字段的数据类型所对应的  
  47.   Class对象  
  48.   String name = field.getName(); //获取字段名  
  49.   if (type.isArray()) { //如果是数组类型则需要特别处理  
  50.   String arrType = type.getComponentType().getName() +  
  51.   "[]";  
  52.   System.out.println("" + modifier + " " + arrType + " "  
  53.   + name + ";");  
  54.   } else {  
  55.   System.out.println("" + modifier + " " + type + " " +  
  56.   name + ";");  
  57.   }  
  58.   }  
  59.   //获取类的构造方法  
  60.   Constructor[] constructors = c1.getDeclaredConstructors();  
  61.   for (Constructor constructor : constructors) {  
  62.   String name = constructor.getName(); //构造方法名  
  63.   modifier = Modifier.toString(constructor.getModifiers()); //获取访问修饰符  
  64.   System.out.println("" + modifier +" " + name + "(");  
  65.   Class[] paramTypes = constructor.getParameterTypes(); //获取构造方法中的参数  
  66.   for (int i = 0; i < paramTypes.length; i++) {  
  67.   if (i > 0) {  
  68.   System.out.print(",");  
  69.   }  
  70.   if (paramTypes[i].isArray()) {  
  71.   System.out.println(paramTypes  
  72.   [i].getComponentType().getName()+"[]");  
  73.   } else {  
  74.   System.out.print(paramTypes[i].getName());  
  75.   }  
  76.   }  
  77.   System.out.println(");");  
  78.   }  
  79.   //获取成员方法  
  80.   Method[] methods = c1.getDeclaredMethods();  
  81.   for (Method method: methods) {  
  82.   modifier = Modifier.toString(method.getModifiers());  
  83.   Class returnType = method.getReturnType(); //获取方法的返回类型  
  84.   if (returnType.isArray()) {  
  85.   String arrType = returnType.getComponentType  
  86.   ().getName()+"[]";  
  87.   System.out.print(""+modifier+" " + arrType + " " +  
  88.   method.getName() + "(");  
  89.   } else {  
  90.   System.out.print("" + modifier + " " +  
  91.   returnType.getName() + " " + method.getName() + "(");  
  92.   }  
  93.   Class[] paramTypes = method.getParameterTypes();  
  94.   for (int i = 0; i < paramTypes.length; i++) {  
  95.   if (i > 0) {  
  96.   System.out.print(",");  
  97.   }  
  98.   if (paramTypes[i].isArray()) {  
  99.   System.out.println(paramTypes  
  100.   [i].getComponentType().getName()+"[]");  
  101.   } else {  
  102.   System.out.print(paramTypes[i].getName());  
  103.   }  
  104.   }  
  105.   System.out.println(");");  
  106.   }  
  107.   }  
  108.   public static void test02() throws InstantiationException,  
  109.   IllegalAccessException, SecurityException, NoSuchMethodException,  
  110.   IllegalArgumentException, InvocationTargetException {  
  111.   //反射调用方法,可以通过Method类的invoke方法实现动态方法的调用  
  112.   //public Object invoke(Object obj, Object... args)  
  113.   //第一个参数代表对象  
  114.   //第二个参数代表执行方法上的参数  
  115.   //若反射要调用类的某个私有方法,可以在这个私有方法对应的Mehtod对象上先  
  116.   调用setAccessible(true)  
  117.   Class c1 = TestReflection.class;  
  118.   TestReflection t1 = (TestReflection) c1.newInstance(); //利用反射来创  
  119.   建类的对象  
  120.   System.out.println("username == " + t1.username);  
  121.   System.out.println("password == " + t1.password);  
  122.   Method method = c1.getDeclaredMethod("setUserName", String.class);  
  123.   method.invoke(t1, "Java反射的学习");  
  124.   System.out.println("username == " + t1.username);  
  125.   method = c1.getDeclaredMethod("setPassWord", String.class);  
  126.   method.setAccessible(true);  
  127.   method.invoke(t1, "反射执行某个Private修饰的方法");  
  128.   System.out.println("password == " + t1.password);  
  129.   }  
  130.   public static void main(String[] args) throws ClassNotFoundException,  
  131.   SecurityException, IllegalArgumentException, InstantiationException,  
  132.   IllegalAccessException, NoSuchMethodException, InvocationTargetException {  
  133.   // test01();  
  134.   test02();  
  135.   }  
  136.   }  
  137.    
  138.   
  139.    


 

七、总节一下

      总的来说,java反射机制是一个很好用的东西,用它可以解决很多死的东西,因为反射机制的灵活行很大,有了他,我们就不要花太多的时间来写操做数据库的代码了,而是方法更多的时间在项目的逻辑功能上,这个可以很大的减少开发时间,而且代码的可读性好。先在的很多开源框架都是才用的反射机制,它只要配置文件,然后按规则来调用他的方法就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT_驿站

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值