色www,五月婷婷深爱五月,午夜国产一级片,色噜噜综合,国产大胸无码视频,清纯美女被操黄网站在线观看,波多野结衣av高清一区二区三区

Java反射機制學習總結

時間:2025-12-08 17:42:06 java語言

Java反射機制學習總結

  一、什么是反射機制

Java反射機制學習總結

  簡單的來說,反射機制指的是程序在運行時能夠獲取自身的信息。在java中,只要給定類的名字,那么就可以通過反射機制來獲得類的所有信息。

  二、哪里用到反射機制

  有些時候,我們用過一些知識,但是并不知道它的專業(yè)術語是什么,在剛剛學jdbc時用過一行代碼, Class.forName("com.mysql.jdbc.Driver.class").newInstance();但是那時候只知道那行代碼是生成驅動對象實例,并不知道它的具體含義。聽了反射機制這節(jié)課后,才知道,原來這就是反射,現(xiàn)在很多開框架都用到反射機制,hibernate、struts都是用反射機制實現(xiàn)的。

  三、反射機制的優(yōu)點與缺點

  為什么要用反射機制?直接創(chuàng)建對象不就可以了嗎,這就涉及到了動態(tài)與靜態(tài)的概念,

  靜態(tài)編譯:在編譯時確定類型,綁定對象,即通過。

  動態(tài)編譯:運行時確定類型,綁定對象。動態(tài)編譯最大限度發(fā)揮了java的靈活性,體現(xiàn)了多態(tài)的應用,有以降低類之間的藕合性。

  一句話,反射機制的優(yōu)點就是可以實現(xiàn)動態(tài)創(chuàng)建對象和編譯,體現(xiàn)出很大的靈活性,特別是在J2EE的開發(fā)中它的靈活性就表現(xiàn)的十分明顯。比如,一個大型的軟件,不可能一次就把把它設計的很完美,當這個程序編譯后,發(fā)布了,當發(fā)現(xiàn)需要更新某些功能時,我們不可能要用戶把以前的卸載,再重新安裝新的版本,假如這樣的話,這個軟件肯定是沒有多少人用的。采用靜態(tài)的話,需要把整個程序重新編譯一次才可以實現(xiàn)功能的更新,而采用反射機制的話,它就可以不用卸載,只需要在運行時才動態(tài)的創(chuàng)建和編譯,就可以實現(xiàn)該功能。

  它的缺點是對性能有影響。使用反射基本上是一種解釋操作,我們可以告訴JVM,我們希望做什么并且它滿足我們的要求。這類操作總是慢于只直接執(zhí)行相同的操作。

  四、利用反射機制能獲得什么信息

  一句話,類中有什么信息,它就可以獲得什么信息,不過前提是得知道類的名字,要不就沒有后文了首先得根據(jù)傳入的類的全名來創(chuàng)建Class對象。

  Class c=Class.forName("className");注明:className必須為全名,也就是得包含包名,比如,cn.netjava.pojo.UserInfo;

  Object obj=c.newInstance();/pic/p>

  OK,有了對象就什么都好辦了,想要什么信息就有什么信息了。

  獲得構造函數(shù)的方法

  Constructor getConstructor(Class[] params)/pic/p>

  Constructor[] getConstructors()/pic/p>

  Constructor getDeclaredConstructor(Class[] params)/pic/p>

  Constructor[] getDeclaredConstructors()/pic/p>

  獲得類方法的方法

  Method getMethod(String name, Class[] params),根據(jù)方法名,參數(shù)類型獲得方法

  Method[] getMethods()/pic/p>

  Method getDeclaredMethod(String name, Class[] params)/pic/p>

  Method[] getDeclaredMethods()/pic/p>

  獲得類中屬性的方法

  Field getField(String name)/pic/p>

  Field[] getFields()/pic/p>

  Field getDeclaredField(String name)/pic/p>

  Field[] getDeclaredFields()/pic/p>

  常用的就這些,知道這些,其他的都好辦……

  五、用反射機制能干什么事

  剛開始在使用jdbc時侯,在編寫訪問數(shù)據(jù)庫時寫到想吐,有八個表,每個表都有增刪改查中操作,那時候還不知道有反射機制這個概念,所以就對不同的表創(chuàng)建不同的dao類,這樣不僅開發(fā)速率地,而且代碼冗余的厲害,最要命的是看著差不多的,然后直接復制修改,由于容易犯各種低級的錯誤(大小寫啊,多一個或少一個字母啊……),一個錯誤就可以讓你找半天。

  有了java反射機制,什么都好辦了,只需要寫一個dao類,四個方法,增刪改查,傳入不同的對象,就OK啦,無需為每一個表都創(chuàng)建dao類,反射機制會自動幫我們完成剩下的事情,這就是它的好處。說白了,反射機制就是專門幫我們做那些重復的有規(guī)則的事情,所以現(xiàn)在很多的自動生成代碼的軟件就是運用反射機制來完成的,只要你按照規(guī)則輸入相關的參數(shù),所以低級的程序員慢慢的就被抹殺了,為什么?因為代碼都不用寫了,隨便一個人都會開發(fā),還要程序員干什么啊?所以我們只有一條出路,那就是努力努力再努力,成為高級程序員,專門開發(fā)傻瓜軟件,讓其他程序員 到 一邊涼快去,呵呵~

  六、用反射機制實現(xiàn)對數(shù)據(jù)庫數(shù)據(jù)的增、查例子

  基本原理;保存數(shù)據(jù)時,把需要保存的對象的屬性值全部取出來再拼湊sql語句查詢時,將查詢到的數(shù)據(jù)全部包裝成一個java對象。

  游戲規(guī)則:俗話說的好,無規(guī)矩不成方圓,特別是程序來說,它只能做有規(guī)則的事情,沒有規(guī)則的它干不了,好,那就先定規(guī)則

  1)數(shù)據(jù)庫的每一個表對象一個pojo類,表中的每一個字段對應pojo類的中的一個屬性。并且pojo類的名字和表的名字相同,屬性名和字段名相同,大小寫沒有關系,因為數(shù)據(jù)庫一般不區(qū)分大小寫

  2)為pojo類中的每一個屬性添加標準的set和get方法。

  有了游戲規(guī)則,那么開始游戲吧。

  1、首先數(shù)據(jù)庫的有一個表,假設數(shù)據(jù)庫名稱為:blogsystem,里面的一個表名userinfo。如圖:

  2、創(chuàng)建對應的pojo類:

  復制代碼 代碼如下:

  package cn.netjava.pojo;

  public class UserInfo {

  private int id;

  private String name;

  private String pwd;

  private int age;

  @Override

  public String toString() {

  return "UserInfo [id=" + id + ", name=" + name + ", pwd=" + pwd + ", age="

  + age + "]";

  }

  public int getId() {

  return id;

  }

  public void setId(int id) {

  this.id = id;

  }

  public String getName() {

  return name;

  }

  public void setName(String name) {

  this.name = name;

  }

  public String getPwd() {

  return pwd;

  }

  public void setPwd(String pwd) {

  this.pwd = pwd;

  }

  public int getAge() {

  return age;

  }

  public void setAge(int age) {

  this.age = age;

  }

  }

  2、編寫獲得數(shù)據(jù)庫連接的工廠類:

  復制代碼 代碼如下:

  package cn.netjava.factory;

  import java.sql.Connection;

  import java.sql.DriverManager;

  public class Connect2DBFactory {

  public static Connection getDBConnection() {

  Connection conn = null;

  try {

  Class.forName("com.mysql.jdbc.Driver");

  String url = "jdbc:mysql:/pic/blogsystem";

  String user = "root";

  String password = "netjava";

  conn = DriverManager.getConnection(url, user, password);

  } catch (Exception e) {

  e.printStackTrace();

  }

  return conn;

  }

  }

  3、好戲開始啦,編寫操作數(shù)據(jù)庫的dao類

  復制代碼 代碼如下:

  package cn.netjava.session;

  import java.lang.reflect.Field;

  import java.lang.reflect.Method;

  import java.sql.Connection;

  import java.sql.PreparedStatement;

  import java.sql.ResultSet;

  import java.sql.SQLException;

  import java.sql.Statement;

  import java.util.ArrayList;

  import java.util.List;

  import cn.netjava.factory.Connect2DBFactory;

  import cn.netjava.pojo.UserInfo;

  public class NetJavaSession {

  /**

  * 解析出保存對象的sql語句

  *

  * @param object

  * :需要保存的對象

  * @return:保存對象的sql語句

  */

  public static String getSaveObjectSql(Object object) {

  /pic/p>

  String sql = " into ";

  /pic/p>

  Class c = object.getClass();

  /pic/p>

  Method[] methods = c.getMethods();

  /pic/p>

  Field[] fields = c.getFields();

  /pic/p>

  String cName = c.getName();

  /pic/p>

  String tableName = cName.substring(cName.lastIndexOf(".") + 1,

  cName.length());

  sql += tableName + "(";

  ListmList = new ArrayList();

  List vList = new ArrayList();

  for (Method method : methods) {

  String mName = method.getName();

  if (mName.startsWith("get") && !mName.startsWith("getClass")) {

  String fieldName = mName.substring(3, mName.length());

  mList.add(fieldName);

  System.out.println("字段名字----->" + fieldName);

  try {

  Object value = method.invoke(object, null);

  System.out.println("執(zhí)行方法返回的值:" + value);

  if (value instanceof String) {

  vList.add(""" + value + """);

  System.out.println("字段值------>" + value);

  } else {

  vList.add(value);

  }

  } catch (Exception e) {

  e.printStackTrace();

  }

  }

  }

  for (int i = 0; i < mList.size(); i++) {

  if (i < mList.size() - 1) {

  sql += mList.get(i) + ",";

  } else {

  sql += mList.get(i) + ") values(";

  }

  }

  for (int i = 0; i < vList.size(); i++) {

  if (i < vList.size() - 1) {

  sql += vList.get(i) + ",";

  } else {

  sql += vList.get(i) + ")";

  }

  }

  return sql;

  }

  public static List getDatasFromDB(String tableName, int Id) {

  return null;

  }

  /**

  * 將對象保存到數(shù)據(jù)庫中

  *

  * @param object

  * :需要保存的對象

  * @return:方法執(zhí)行的結果;1:表示成功,0:表示失敗

  */

  public int saveObject(Object object) {

  Connection con = Connect2DBFactory.getDBConnection();

  String sql = getSaveObjectSql(object);

  try {

  /pic/p>

  PreparedStatement psmt = con.prepareStatement(sql);

  psmt.executeUpdate();

  return 1;

  } catch (SQLException e) {

  e.printStackTrace();

  return 0;

  }

  }

  /**

  * 從數(shù)據(jù)庫中取得對象

  *

  * @param arg0

  * :對象所屬的類

  * @param id

  * :對象的id

  * @return:需要查找的對象

  */

  public Object getObject(String className, int Id) {

  /pic/p>

  String tableName = className.substring(className.lastIndexOf(".") + 1,

  className.length());

  /pic/p>

  Class c = null;

  try {

  c = Class.forName(className);

  } catch (ClassNotFoundException e1) {

  e1.printStackTrace();

  }

  /pic/p>

  String sql = "select * from " + tableName + " where Id=" + Id;

  System.out.println("查找sql語句:" + sql);

  /pic/p>

  Connection con = Connect2DBFactory.getDBConnection();

  /pic/p>

  Object obj = null;

  try {

  Statement stm = con.createStatement();

  /pic/p>

  ResultSet set = stm.executeQuery(sql);

  /pic/p>

  Method[] methods = c.getMethods();

  /pic/p>

  while (set.next()) {

  obj = c.newInstance();

  /pic/p>

  for (Method method : methods) {

  String methodName = method.getName();

  /pic/p>

  if (methodName.startsWith("set")) {

  /pic/p>

  String columnName = methodName.substring(3,

  methodName.length());

  /pic/p>

  Class[] parmts = method.getParameterTypes();

  if (parmts[0] == String.class) {

  /pic/p>

  method.invoke(obj, set.getString(columnName));

  }

  if (parmts[0] == int.class) {

  method.invoke(obj, set.getInt(columnName));

  }

  }

  }

  }

  } catch (Exception e) {

  e.printStackTrace();

  }

  return obj;

  }

  }

  4、開始測試效果怎么樣:

  復制代碼 代碼如下:

  package cn.netjava.tester;

  import cn.netjava.pojo.UserInfo;

  import cn.netjava.session.NetJavaSession;

  public class Tester {

  public static void main(String args[]) {

  /pic/p>

  NetJavaSession session = new NetJavaSession();

  /pic/p>

  UserInfo user = new UserInfo();

  /pic/p>

  user.setId(6988);

  user.setAge(44);

  user.setPwd("pwd");

  user.setName("champion");

  /pic/p>

  String sql = session.getSaveObjectSql(user);

  System.out.println("保存對象的sql語句:" + sql);

  /pic/p>

  UserInfo userInfo = (UserInfo) session.getObject(

  "cn.netjava.pojo.UserInfo", 6988);

  System.out.println("獲取到的信息:" + userInfo);

  }

  }

  5、打印出來的結果:

  七、總節(jié)一下

  總的來說,java反射機制是一個很好用的東西,用它可以解決很多死的東西,因為反射機制的靈活行很大,有了他,我們就不要花太多的時間來寫操做數(shù)據(jù)庫的代碼了,而是方法更多的時間在項目的邏輯功能上,這個可以很大的減少開發(fā)時間,而且代碼的可讀性好。先在的很多開源框架都是才用的反射機制,它只要配置文件,然后按規(guī)則來調用他的方法就可以了。

【Java反射機制學習總結】相關文章:

Java反射機制02-10

java中反射機制07-19

Java反射機制應用實踐09-12

Java實現(xiàn)反射學習函數(shù)的應用08-11

關于Java 反射的簡介10-29

java使用反射技術示例10-08

java的緩存機制03-06

深入理解java的反射11-28

java的緩存機制簡介12-17