day07 反射

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

 

上一篇:Day07 - 字符串和常用数据结构


下一篇:day07作业