• Java教程之Java反射


    反射是Java中核心技术之一,这里先不定义什么叫反射,先看一个例子

    public class Person {

    public void run() {

    System.out.println("Hello Wolrd");

    }

    }

    要求:

    1) 创建一个person的实例,单不能使用Person person = new Person()的方式

    2) 调用run()方法,也不能使用person.run()方式

    我们知道要调用方法必须先要有对象,现在不能通过new关键字来实例化对象,只能通过反射来实现。

    public static void main(String[] args) throws Exception {

    // 1.先把类加载起来

    Class<?> cls = Class.forName("com.qf.doc.Person");

    // 2.实例化对象

    Object person = cls.newInstance(); //调用无惨构造,等价于 new Person();

    // 3.得到要执行的方法,此时方法也是一个对象

    Method mehtod = cls.getMethod("run");

    // 4.调用方法

    mehtod.invoke(person);

    }

    上面就实现用反射的方式调用preson类中的方法。可能有人要问了,为什么不直接new 出来呢? 通过反射来创建对象,调用方法多费劲啊?

    关键在于很多时候我们并不能事先知道要new 什么对象,相反我们可能只知道一个类的名称和方法名, 很多时候这些名称都是写在XML配置当中的。

    好多框架中用到了反射,比如sturts,spring,hibernate等,下面举几个列子说明

    【Strust2】

    在struts.xml中配置的action

    <package name="topic" namespace="/forum/topic" extends="struts-default">

    <action name="findTopicPage" class="com.qf.action.TopicAction" method="findTopicPage">

    <result>topicList.jsp</result>

    </action>

    <action name="findTopicById" class="com.qf.action.TopicAction" method="findTopicById">

    <result>topicInfo.jsp</result>

    </action>

    </package>

    定义的action

    public class TopicAction extends ActionSupport {

    private Page page = new Page();

    private ITopicService topicService = new TopicServiceImpl();

    private IReplyService replyService = new ReplyServiceImpl();

    private Topic topic;

    public String findTopicPage() {

    topicService.getTopicPage(page);

    page.setUrl("forum/topic/findTopicPage?");

    return Action.SUCCESS;

    }

    }

    Struts2框架本身不知道我们有一个TopicAction这个类,但它可以这样做,在struts2框架初始化的时候解析你配置的xml,再找到你配置TopicAction,然后通过反射的技术实例化这个类,等在有人调用的时候通过反射调用topicAction中的方法。

    【Hibernate】

    hibernate建立数据库表和对象之间的映射

    实体类类的定义

    public class Topic {

    private Integer id;

    private String title;

    private String content;

    private Date createDate;

    private User user; // 发帖人

    }

    映射文件的定义

    <hibernate-mapping package="com.qf.entity">

    <class name="Topic" table="t_topic">

    <id name="id" column="id">

    <generator class="native" />

    </id>

    <property name="title"/>

    <property name="content" />

    <property name="createDate" column="create_date" />

    </class>

    </hibernate-mapping>

    在映射文件中建立了数据表和对象的映射关系,所以我们在hibernate中操作的都是对象,但是底层都会转成sql执行,比如我们要查询一个对象,

    Topic topic = session.get(Topic.class,12);

    执行过程是这样的:

    【类名】→【表明】→【发出sql语句】→【通过反射实例化对象】→【通过反射调用setXxx()方法把数据库的值设进入】

    总结一下,反射就是在编译期不知道创建那个类,而是在运行期才知道创建那个类,这种情况下就应该考虑到用反射。

    那反射能做什么呢?

    1) 获取一个类的内部结构,比如:方法,属性,注解等

    2) 运行时对一个Java对象操作,包括实例化对象,调用方法,给属性赋值。

    为什么叫反射呢?

    可能是Java程序在运行时能够看到自己的结构和行为吧,就像看到镜子当中的自己一样, 反射了出来。

  • 相关阅读:
    欧拉回路的判断(hdu1878)其一
    最长公共子序列(不是子串)hdu1159
    线段树(hdu1166)
    记忆化搜索(hdu1078)
    分考场问题。。。
    hdu2087
    cf540C
    x86 寄存器 | DPL,RPL,CPL 之间的联系和区别
    深度学习 | 训练网络trick——mixup
    python | Argparse中action的可选参数store_true,store_false到底是什么意思?
  • 原文地址:https://www.cnblogs.com/coffees/p/12327067.html
Copyright © 2020-2023  润新知