技术分享: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

resulttopicList.jsp/result

/action


action name=findTopicById class=com.qf.action.TopicAction method=findTopicById

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值