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; } }