day07 反射
程序员文章站
2022-03-20 12:42:28
package cn.gzsxt.test; import java.lang.reflect.Field; import java.lang.reflect.Method; public class TestClass { public static void main(String[] args... ......
package cn.gzsxt.test; import java.lang.reflect.field; import java.lang.reflect.method; public class testclass { public static void main(string[] args) { try { //1.由于class类没有公共构造方法,所有创建class的对象的方法有以下几种: //①通过class.forname()静态方法返回class类的一个实例 class cls = class.forname("cn.gzsxt.test.dog"); //②通过类名.class来获取一个class类的实例 //cls = dog.class; //③代码运行在非静态区,通过this.getclass()获取class类的一个实例 //class cls = this.getclass(); //2.class对象既然是描述一个类,那么我们通过该class的实例能够做什么事情呢? //类的属性 //获取类名 system.out.println(cls.getname()); system.out.println(cls.getsimplename()); //获取类的修饰限定符 int modi = cls.getmodifiers(); system.out.println(modi); //获取一个类的属性 //根据一个属性名获取一个public属性的描述 field field = cls.getfield("name"); //获取一个类的全部public属性的描述 field[] fields = cls.getfields(); system.out.println(fields.length); //根据一个属性名获取一个在类中声明的属性的描述 field declaredfield = cls.getdeclaredfield("gender"); //获取所有在类中声明的属性的描述 field[] declaredfields = cls.getdeclaredfields(); //获取一个类的方法 //根据一个方法的名字获取类中的一个public的方法的描述 method method = cls.getmethod("run", string.class,int.class); //获取所有在类中是public的方法的描述 method[] methods = cls.getmethods(); //根据一个方法名获取在类中声明的一个方法的描述 method declaredmethod = cls.getdeclaredmethod("eat", null); //获取所有在类中声明的方法的描述 method[] declaredmethods = cls.getdeclaredmethods(); //返回cls所代表的类的实例 object obj = cls.newinstance(); system.out.println(obj); /*constructor c = cls.getconstructor(string.class); c.newinstance("aaa");*/ } catch (classnotfoundexception e) { e.printstacktrace(); } catch (nosuchfieldexception e) { e.printstacktrace(); } catch (securityexception e) { e.printstacktrace(); } catch (nosuchmethodexception e) { e.printstacktrace(); } catch (instantiationexception e) { e.printstacktrace(); } catch (illegalaccessexception e) { e.printstacktrace(); } } }
package cn.gzsxt.test; import java.lang.reflect.field; public class testfield { public static void main(string[] args) { class cls = dog.class; //获取其属性 try { //使用filed类的一个实例,来描述cls类的实例中的"一个"属性 field field = cls.getdeclaredfield("gender"); //获取属性的名字 system.out.println(field.getname()); //获取属性的类型 class strcls = field.gettype(); system.out.println(strcls.getname()); //获取属性的限定符 int modifiers = field.getmodifiers(); system.out.println(modifiers); //创建dog类的一个对象 dog d = new dog("旺财","母"); //暴力设置:设置field的访问 //field.setaccessible(true); //有d对象,希望给d对象的gender属性赋值,可以使用set方法 //field.set(d, "公"); //返回d对象的gender属性的值,可以使用get方法 system.out.println(field.get(d)); } catch (nosuchfieldexception e) { e.printstacktrace(); } catch (securityexception e) { e.printstacktrace(); } catch (illegalargumentexception e) { e.printstacktrace(); } catch (illegalaccessexception e) { e.printstacktrace(); } } }
package cn.gzsxt.test; import java.lang.reflect.constructor; import java.lang.reflect.invocationtargetexception; import java.lang.reflect.method; import java.util.iterator; public class testmethod { public static void main(string[] args) { class cls = dog.class; //通过cls.getdeclaredmethod获取method对象 try { // method m = cls.getdeclaredmethod("run", string.class,int.class); method m = cls.getdeclaredmethod("eat", null); //获取方法名 system.out.println(m.getname()); //方法的返回值类型 class returntype = m.getreturntype(); system.out.println(returntype.getname()); //方法的参数类型 class[] paratype = m.getparametertypes(); for (int i = 0; i < paratype.length; i++) { system.out.println(paratype[i].getname()); } //获取方法的修饰符 int modifiers = m.getmodifiers(); dog d = new dog("旺财", "母"); //方法是可以执行的,使用invoke执行method对象所表示的方法 //m.invoke(d, "aaa",123); m.invoke(d, null); } catch (nosuchmethodexception e) { e.printstacktrace(); } catch (securityexception e) { e.printstacktrace(); } catch (illegalaccessexception e) { e.printstacktrace(); } catch (illegalargumentexception e) { e.printstacktrace(); } catch (invocationtargetexception e) { e.printstacktrace(); } } }
package cn.gzsxt.test; import java.lang.reflect.field; import java.lang.reflect.invocationtargetexception; import java.lang.reflect.method; import cn.gzsxt.model.person; public class testmethod2 { public static void main(string[] args) { person p = new person(); //使用反射相关类,为对象p设置name属性的值 class cls = p.getclass(); field[] fs = cls.getdeclaredfields(); for (int i = 0; i < fs.length; i++) { field f = fs[i]; if(f.getname().equals("name")) { string setname = "set"+f.getname().substring(0, 1).touppercase()+ f.getname().substring(1); //设置器的形参和属性的类型应当一致 try { method m = cls.getdeclaredmethod(setname, f.gettype()); //相当于p方法调用了setname方法 m.invoke(p , "zhangsan"); } catch (nosuchmethodexception e) { e.printstacktrace(); } catch (securityexception e) { e.printstacktrace(); } catch (illegalaccessexception e) { e.printstacktrace(); } catch (illegalargumentexception e) { e.printstacktrace(); } catch (invocationtargetexception e) { e.printstacktrace(); } } } system.out.println(p.getname()); } }
package cn.gzsxt.test; 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.resultsetmetadata; import java.sql.sqlexception; import java.util.arraylist; import java.util.list; import cn.gzsxt.model.dept; import cn.gzsxt.model.emp; import cn.gzsxt.model.t_user; import cn.gzsxt.util.dbutil; import cn.gzsxt.vo.empdeptvo; public class testuser { public static void main(string[] args) { testuser tu = new testuser(); /* * list list = tu.getalluser(); list list2 = tu.getallemp(); */ // 封装就是将相同保留下来,不同的作为参数传递 list list = tu.rows2beans("select ename,dname,sal from emp e,dept d where e.deptno = d.deptno", empdeptvo.class); for (int i = 0; i < list.size(); i++) { empdeptvo d = (empdeptvo) list.get(i); system.out.println(d); } } // 目的:将数据库中的一行记录转化为java中一个对象 public list rows2beans(string sql, class cls) { list list = new arraylist<>(); // 查询数据库 connection conn = dbutil.getconnection(); preparedstatement ps = null; resultset rs = null; try { ps = conn.preparestatement(sql); rs = ps.executequery(); // 每一个rs对象都对应一个resultsetmetadata对象 resultsetmetadata rsmd = rs.getmetadata(); // 获取查询的列数 int count = rsmd.getcolumncount(); while (rs.next()) { object object = cls.newinstance(); // 有class cls决定生成什么对象 for (int i = 0; i < count; i++) { // 获取第一列的名字 string fieldname = rsmd.getcolumnname(i + 1).tolowercase(); // 通过列名获取类中的属性的描述 field field = cls.getdeclaredfield(fieldname); // 根据set方法名获取set方法对应的描述类 method m = cls.getdeclaredmethod(getsetmethodname(fieldname), field.gettype()); object objval = rs.getobject(fieldname); if (objval != null) { if (objval instanceof number) { if (field.gettype().getname().equals("int") || field.gettype().getname().equals("java.lang.integer")) { m.invoke(object, rs.getint(fieldname)); } else if (field.gettype().getname().equals("long") || field.gettype().getname().equals("java.lang.long")) { m.invoke(object, rs.getlong(fieldname)); } else if (field.gettype().getname().equals("double") || field.gettype().getname().equals("java.lang.double")) { m.invoke(object, rs.getdouble(fieldname)); } else if (field.gettype().getname().equals("short") || field.gettype().getname().equals("java.lang.short")) { m.invoke(object, rs.getshort(fieldname)); } else if (field.gettype().getname().equals("byte") || field.gettype().getname().equals("java.lang.byte")) { m.invoke(object, rs.getbyte(fieldname)); } else if (field.gettype().getname().equals("float") || field.gettype().getname().equals("java.lang.float")) { m.invoke(object, rs.getfloat(fieldname)); } } else { m.invoke(object, objval); } } } list.add(object); } } catch (exception e) { e.printstacktrace(); } finally { dbutil.close(conn, ps, rs); } return list; } public string getsetmethodname(string fieldname) { return "set" + fieldname.substring(0, 1).touppercase() + fieldname.substring(1); } public list getallemp() { list list = new arraylist<>(); connection conn = dbutil.getconnection(); preparedstatement ps = null; resultset rs = null; try { string sql = "select * from emp"; ps = conn.preparestatement(sql); rs = ps.executequery(); while (rs.next()) { // 创建一个emp的对象 emp e = new emp(); e.setempno(rs.getint("empno")); e.setename(rs.getstring("ename")); e.setjob(rs.getstring("job")); e.setmgr(rs.getint("mgr")); e.sethiredate(rs.getdate("hiredate")); e.setsal(rs.getdouble("sal")); e.setcomm(rs.getdouble("comm")); e.setdeptno(rs.getint("deptno")); list.add(e); } } catch (sqlexception e) { e.printstacktrace(); } finally { dbutil.close(conn, ps, rs); } return list; } // 从数据库中查询一张表,将一张表的每一行数据封装为一个java对象,再将众多java对象放入一个list中 public list getalluser() { list list = new arraylist<>(); // 查询数据库 connection conn = dbutil.getconnection(); preparedstatement ps = null; resultset rs = null; try { string sql = "select * from t_user"; ps = conn.preparestatement(sql); rs = ps.executequery(); while (rs.next()) { // 如何保存数据库中的众多数据 t_user tuser = new t_user(); tuser.setid(rs.getint("id")); tuser.setusername(rs.getstring("username")); tuser.setpassword(rs.getstring("password")); list.add(tuser); } } catch (sqlexception e) { e.printstacktrace(); } finally { dbutil.close(conn, ps, rs); } return list; } }