JAVAEE反射技术

举报
tea_year 发表于 2022/02/27 20:15:18 2022/02/27
【摘要】 1 为什么需要反射?(reflect)Person p = new Student();p在编译时的类型是person,但是在运行时是student。为了让程序在运行时发现对象和类的真实信息,有两种做法:1,假设我们知道类的具体信息,可以通过instanceof 运算符进行判断。2,在编译的时候不知道对象和类的信息,可以通过反射获取。三种获取class对象的方法。//获取Class对象第一种...

1 为什么需要反射?(reflect)

Person p = new Student();


p在编译时的类型是person,但是在运行时是student。


为了让程序在运行时发现对象和类的真实信息,有两种做法:

1,假设我们知道类的具体信息,可以通过instanceof 运算符进行判断。

2,在编译的时候不知道对象和类的信息,可以通过反射获取。


三种获取class对象的方法。

//获取Class对象第一种class.forName

        /*try {

            Class clazz1 = Class.forName("com.aaa.entity.Person");

        } catch (ClassNotFoundException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }*/

        //获取Class对象第二种.class

        Class clazz2 = Person.class;

        //获取Class对象第三种getClass()

    /*    Person p = new Person();

        Class class3 = p.getClass();*/

getName() :以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。

getSimpleName() :返回源代码中给出的基础类的简称。

newInstance() :创建此 Class 对象所表示的类的一个新实例。

forName(String className) :返回与带有给定字符串名的类或接口相关联的 Class 对象


使用反射获取构造器

//获取构造器

        Constructor[] cons = s.getClass().getConstructors();

        for (Constructor constructor : cons) {

            System.out.println(constructor);

        }

使用反射获取公共方法,注意不包括构造方法,但是包括Object中的方法

Method[] methods = clazz2.getMethods();

        System.out.println(methods.length);

        for (Method method : methods) {

            System.out.println(method.getName());

        }

使用反射获取所有包括私有方法,注意不包括构造方法,但是不包括Object中的(继承的)方法

/*Method[] methods2 = clazz2.getDeclaredMethods();

        System.out.println(methods2.length);

        for (Method method : methods2) {

            System.out.println(method.getName());

        }*/

使用反射获取属性,getFields只能获取公共属性

Field[] fields = clazz2.getFields();

        System.out.println(fields.length);

如果想获取所有的,使用getDeclaredFields ()

Field[] fields = clazz2.getDeclaredFields();

        System.out.println(fields.length);

设置对象属性

Student student = new Student();

        Field field = student.getClass().getDeclaredField("name");

        //field.setAccessible(true);

        field.set(student, "张三");

        System.out.println(student.getName());


2 创建持久层框架

/**

     * 通用方法获取对象集合

     */

    public static List selectObjList(String sql,Object[] params,Class clazz) throws Exception{

        List list = new ArrayList();

        con = getConnection();

        try {

            ps = con.prepareStatement(sql);

            setParams(params);

            rs = ps.executeQuery();

            //列数

            ResultSetMetaData rsm = rs.getMetaData();

            int count = rsm.getColumnCount();//获取列数

            while(rs.next()){

                Object obj = clazz.newInstance();//实例化一个对象

                for(int i=1;i<=count;i++){

                    String key = rsm.getColumnName(i);//获取列名

                    Object value = rs.getObject(i);//获取对应列的值

                    Field field = clazz.getDeclaredField(key);//获取对象的成员变量(字段名)

                    field.setAccessible(true);//设置可访问

                    if(value!=null){

                        field.set(obj, value);

                    }

                }

                list.add(obj);

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }finally{

            closeAll();

        }

        return list;

    }


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。