经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
Java的反射技术
来源:cnblogs  作者:HHH燕  时间:2019/10/28 10:28:04  对本文有异议

1、Java 反射技术

  Java反射技术应用广泛,它能够配置:类的全限定名、方法和参数,完成对象的初始化,甚至是反射某些方法。这样可以大大增强Java的可配置性,如Spring IoC 的基本原理也是反射,当然Spring IoC 的代码要复炸得多,还有其他的技术结合。

  Java 的反射内容繁多, 包括对象的构建、反射方法、注解、参数、接口等。这次主要讲一下对象的构建和反射的方法。在Java中,反射是通过包java.lang.reflect.* 来实现的。

 

2、通过反射构建对象

  在Java中允许通过反射配置信息构造对象。

  首先创建一个对象:

  1. package com.hhh.learn.reflect;
  2. /**
  3. * 对象
  4. * @author chao
  5. *
  6. */
  7. public class ReflectServiceImpl {
  8. private String name;
  9. //不带参的构造方法
  10. public ReflectServiceImpl(){}
  11. //带参构造方法
  12. public ReflectServiceImpl(String name){
  13. this.name = name;
  14. }
  15. public void sayHello(String name){
  16. System.out.println("Hello!" + name);
  17. }
  18. public void sayHello(){
  19. System.out.println("Hello!" + name);
  20. }
  21. }

  然后通过反射方法去构造这个对象,如下代码:

  1. //不带参
  2. public ReflectServiceImpl getInstance(){
  3. ReflectServiceImpl object = null;
  4. try{
  5. object = (ReflectServiceImpl) Class.forName("com.hhh.learn.reflect.ReflectServiceImpl").newInstance();
  6. }catch(Exception e){
  7. e.printStackTrace();
  8. }
  9. return object;
  10. }

   这里的代码就可以利用反射去构造了一个 ReflectServiceImpl 对象。其实利用反射方法构造对象就是给类加载器注册了一个类的全限定名,再通过 newInstance() 的方法来初始化一个对象。

   若要构造带参的对象,可以查看以下代码:

  1. public ReflectServiceImpl getInstance2(){
  2. ReflectServiceImpl object = null;
  3. try{
  4. object = (ReflectServiceImpl) Class.forName("com.hhh.learn.reflect.ReflectServiceImpl").getConstructor(String.class).newInstance("张三");
  5. }catch(Exception e){
  6. e.printStackTrace();
  7. }
  8. return object;
  9. }

  先通过 forName()的方法将类加载到加载器中,再通过 getConstructor()方法选择哪一个构造方法,最后通过 newInstance() 的方法来初始化一个对象。

 

3、反射方法

  再上面我们已经构造了对象,就可以调用他们的方法了,代码如下:

  1.      ReflectServiceImpl object = null;
  2. try{
  3. object = (ReflectServiceImpl) Class.forName("com.hhh.learn.reflect.ReflectServiceImpl").newInstance();
  4. Method method = object.getClass().getMethod("sayHello", String.class);
  5. method.invoke(object, "李四");
  6. }catch(Exception e){
  7. e.printStackTrace();
  8. }

  对象构造好,通过 getClass() 的方法获取对应的对象, 再通过 getMethod()方法获取对应的方法,里面填调用的方法名和参数的类型, 最后就调用 invoke() 方法执行对应的方法,里面要写明对象和参数的值。通过这样就可以利用反射的方式去调用方法了。

 

4、反射的优点和缺点

  反射的优点:只要配置就可以生成对象,可以解除程序的耦合度,比较灵活,大大增强的可配置性和可扩展性。

  反射的缺点:运行比较慢。

  

原文链接:http://www.cnblogs.com/HHHY/p/11741981.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号