zoukankan      html  css  js  c++  java
  • 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程序在运行时能够看到自己的结构和行为吧,就像看到镜子当中的自己一样, 反射了出来。

  • 相关阅读:
    jQuery 基本选择器
    JavaScriptif while for switch流程控制 JS函数 内置对象
    JavaScrip基本语法
    数据库 存储引擎 表的操作 数值类型 时间类型 字符串类型 枚举集合 约束
    数据库基础知识 管理员 用户登录授权的操作
    粘包的产生原理 以及如何解决粘包问题
    socket TCP DPT 网络编程
    2018年年终总结
    Android技术分享
    No accelerator found
  • 原文地址:https://www.cnblogs.com/coffees/p/12327067.html
Copyright © 2011-2022 走看看