欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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