1、什么是反射机制
复杂的来说,反射机制指的是顺序在运行时可以或许获得本身的信息。在java中,只要给定类的名字,那么就能够经由过程反射机制来得到类的所有信息。
2、哪里用到反射机制
有些时候,我们用过一些常识,但是其实不知道它的专业术语是什么,在方才学jdbc时用过一行代码, Class.forName"com.mysql.jdbc.Driver.class".newInstance;但是当时候只知道那行代码是生成驱动工具实例,其实不知道它的具体寄义。听了反射机制这节课后,才知道,本来这就是反射,目下当今很多开框架都用到反射机制,hibernate、struts都是用反射机制实现的。
3、反射机制的优点与错误谬误
为何要用反射机制?间接创立工具不就能够了吗,这就触及到了静态与静态的观点,
静态编译:在编译时断定范例,绑定工具,即经由过程。
静态编译:运行时断定范例,绑定工具。静态编译最大限度发扬了java的机动性,表现了多态的应用,有以低落类之间的藕合性。
一句话,反射机制的优点就是可以实现静态创立工具和编译,表现出很大的机动性,出格是在J2EE的开发中它的机动性就施展阐发的非常分明。比方,一个大型的软件,不成能一次就把把它计划的很完美,当这个顺序编译后,公布了,当发明必要更新某些功效时,我们不成能要用户把从前的卸载,再从头装置新的版本,假设这样的话,这个软件必定是没有几多人用的。采纳静态的话,必要把整个顺序从头编译一次才可以实现功效的更新,而采纳反射机制的话,它就能够不必卸载,只必要在运行时才静态的创立和编译,就能够实现该功效。
它的错误谬误是对功能有影响。使用反射根本上是一种表明操纵,我们可以报告JVM,我们但愿做什么而且它满足我们的要求。这类操纵总是慢于只间接执行不异的操纵。
4、操纵反射机制能得到什么信息
一句话,类中有什么信息,它就能够得到什么信息,不外前提是得知道类的名字,要不就没有后文了首先得按照传入的类的全名来创立Class工具。
Class c=Class.forName"className";注明:className必需为全名,也就是得包括包名,比方,cn.netjava.pojo.UserInfo;
Object obj=c.newInstance;//创立工具的实例
OK,有了工具就什么都好办了,想要什么信息就有什么信息了。
得到机关函数的办法
Constructor getConstructorClass[] params//按照指定参数得到public机关器
Constructor[] getConstructors//得到public的所有机关器
Constructor getDeclaredConstructorClass[] params//按照指定参数得到public和非public的机关器
Constructor[] getDeclaredConstructors//得到public的所有机关器
得到类办法的办法
Method getMethodString name, Class[] params,按照办法名,参数范例得到办法
Method[] getMethods//得到所有的public办法
Method getDeclaredMethodString name, Class[] params//按照办法名和参数范例,得到public和非public的办法
Method[] getDeclaredMethods//得到所以的public和非public办法
得到类中属性的办法
Field getFieldString name//按照变量名失掉相应的public变量
Field[] getFields//得到类中所以public的办法
Field getDeclaredFieldString name//按照办法名得到public和非public变量
Field[] getDeclaredFields//得到类中所有的public和非public办法
经常使用的就这些,知道这些,其他的都好办……
5、用反射机制能干什么事
刚入手下手在使用jdbc时侯,在编写拜访数据库时写到想吐,有八个表,每一个表都有增编削查中操纵,当时候还不知道有反射机制这个观点,所以就对差别的表创立差别的dao类,这样不但开发速率地,并且代码冗余的锋利,最要命的是看着差不多的,然后间接复制点窜,由于简单犯各类初级的过错(大小写啊,多一个或少一个字母啊……),一个过错就能够让你找半天。
有了java反射机制,什么都好办了,只必要写一个dao类,四个办法,增编削查,传入差别的工具,就OK啦,无需为每个表都创立dao类,反射机制会自动帮我们完成剩下的工作,这就是它的好处。说白了,反射机制就是专门帮我们做那些反复的有划定规矩的工作,所以目下当今很多的自动生成代码的软件就是运用反射机制来完成的,只要你依照划定规矩输入相关的参数,所以初级的顺序员渐渐的就被扼杀了,为何?因为代码都不必写了,随便一小我私家城市开发,还要顺序员干什么啊?所以我们只有一条出路,那就是积极积极再积极,成为初级顺序员,专门开发傻瓜软件,让其他顺序员 到 一边凉快去,呵呵~
6、用反射机制实现对数据库数据的增、查例子
根本道理;保管数据时,把必要保管的工具的属性值全部取出来再拼凑sql语句查询时,将查询到的数据全部包装成一个java工具。
游戏划定规矩:俗语说的好,无端方不成方圆,出格是顺序来说,它只能做有划定规矩的工作,没有划定规矩的它干不了,好,那就先定例则
1)数据库的每个表工具一个pojo类,表中的每个字段对应pojo类的.中的一个属性。而且pojo类的名字和表的名字不异,属性名和字段名不异,大小写没有干系,因为数据库一样平常不辨别大小写
2)为pojo类中的每个属性添加规范的set和get办法。
有了游戏划定规矩,那么入手下手游戏吧。
1、首先数据库的有一个表,假定数据库称号为:blogsystem,里面的一个表名userinfo。如图:
2、创立对应的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 setIdint id
this.id = id;
public String getName
return name;
public void setNameString name
this.name = name;
public String getPwd
return pwd;
public void setPwdString pwd
this.pwd = pwd;
public int getAge
return age;
public void setAgeint age
this.age = age;
2、编写得到数据库连接的工场类:
复制代码 代码如下:
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://localhost:3306/blogsystem";
String user = "root";
String password = "netjava";
conn = DriverManager.getConnectionurl, user, password;
catch Exception e
e.printStackTrace;
return conn;
3、好戏入手下手啦,编写操纵数据库的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 getSaveObjectSqlObject object
// 界说一个sql字符串
String sql = " into ";
// 失掉工具的类
Class c = object.getClass;
// 失掉工具中所有的办法
Method[] methods = c.getMethods;
// 失掉工具中所有的属性
Field[] fields = c.getFields;
// 失掉工具类的名字
String cName = c.getName;
// 从类的名字中解析出表名
String tableName = cName.substringcName.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.substring3, mName.length;
mList.addfieldName;
System.out.println"字段名字----->" + fieldName;
try
Object value = method.invokeobject, null;
System.out.println"执行办法返回的值:" + value;
if value instanceof String
vList.add""" + value + """;
System.out.println"字段值------>" + value;
else
vList.addvalue;
catch Exception e
e.printStackTrace;
for int i = 0; i < mList.size; i++
if i < mList.size - 1
sql += mList.geti + ",";
else
sql += mList.geti + " values";
for int i = 0; i < vList.size; i++
if i < vList.size - 1
sql += vList.geti + ",";
else
sql += vList.geti + "";
return sql;
public static List getDatasFromDBString tableName, int Id
return null;
/**
* 将工具保管到数据库中
*
* @param object
* :必要保管的工具
* @return:办法执行的成果;1:透露表现成功,0:透露表现失败
*/
public int saveObjectObject object
Connection con = Connect2DBFactory.getDBConnection;
String sql = getSaveObjectSqlobject;
try
// Statement statement=Statement con.createStatement;
PreparedStatement psmt = con.prepareStatementsql;
psmt.executeUpdate;
return 1;
catch SQLException e
e.printStackTrace;
return 0;
/**
* 从数据库中获得工具
*
* @param arg0
* :工具所属的类
* @param id
* :工具的id
* @return:必要查找的工具
*/
public Object getObjectString className, int Id
// 失掉表名字
String tableName = className.substringclassName.lastIndexOf"." + 1,
className.length;
// 按照类名来创立Class工具
Class c = null;
try
c = Class.forNameclassName;
catch ClassNotFoundException e1
e1.printStackTrace;
// 拼凑查询sql语句
String sql = "select * from " + tableName + " where Id=" + Id;
System.out.println"查找sql语句:" + sql;
// 得到数据库链接
Connection con = Connect2DBFactory.getDBConnection;
// 创立类的实例
Object obj = null;
try
Statement stm = con.createStatement;
// 失掉执行查寻语句返回的成果集
ResultSet set = stm.executeQuerysql;
// 失掉工具的办法数组
Method[] methods = c.getMethods;
// 遍历成果集
while set.next
obj = c.newInstance;
// 遍历工具的办法
for Method method : methods
String methodName = method.getName;
// 假如工具的办法以set开头
if methodName.startsWith"set"
// 按照办法名字失掉数据表格中字段的名字
String columnName = methodName.substring3,
methodName.length;
// 失掉办法的参数范例
Class[] parmts = method.getParameterTypes;
if parmts[0] == String.class
// 假如参数为String范例,则从成果会合依照列名获得对应的值,而且执行改set办法
method.invokeobj, set.getStringcolumnName;
if parmts[0] == int.class
method.invokeobj, set.getIntcolumnName;
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 mainString args[]
//得到NetJavaSession工具
NetJavaSession session = new NetJavaSession;
//创立一个UserInfo工具
UserInfo user = new UserInfo;
//设置工具的属性
user.setId6988;
user.setAge44;
user.setPwd"pwd";
user.setName"champion";
//将工具保管到数据库中
String sql = session.getSaveObjectSqluser;
System.out.println"保管工具的sql语句:" + sql;
//查找工具
UserInfo userInfo = UserInfo session.getObject
"cn.netjava.pojo.UserInfo", 6988;
System.out.println"获得到的信息:" + userInfo;
5、打印出来的成果:
7、总节一下
总的来说,java反射机制是一个很好用的工具,用它可以办理很多死的工具,因为反射机制的机动行很大,有了他,我们就不要花太多的时间来写操做数据库的代码了,而是办法更多的时间在项目的逻辑功效上,这个可以很大的减少开发时间,并且代码的可读性好。先在的很多开源框架都是才用的反射机制,它只要设置装备摆设文件,然后按划定规矩来调用他的办法就能够了。