• 反射


    1.什么情况下需要使用反射?


    在编译时无法知道该对象或类属于哪些类,程序只依靠运行时信息来发现该对象和类的真实信息。此时用反射。


    2.Class类的作用及其主要功能?


    我们说类是对象的设计图,像User类,Person类,Student类,每个类可以创建多个对象。而Class类是谁的设计图呢?Class类是类的设计图?也就是说,User类,Person类,Student类等每个类都是一个Class类的实例,在运行时都对应着一个Class对象。
    Class类提供了很多方法,比如反射技术常用到的Class.forName("包.类(如User类)");这样可以获取User类的Class对象。通过这个Class对象,我们可以调用User类的方法,属性,构造方法等。


    3.如何使用反射创建一个对象?


    方法一:使用Class的newInstance()方法,仅适用于无参构造方法;
    示例代码:
    Class<User> clazz=(Class<User>)Class.forName("cn.bjsxt.bean.User");
    User u=clazz.newInstance();

    方法二:调用Constructor的newInstance()方法,适用所有构造方法;
    示例代码:
    Class<User> clazz=(Class<User>)Class.forName("cn.bjsxt.bean.User");
    Constructor<User> cons = clazz.getConstructor(int.class,int.class, String.class,String.class );
    User u= cons.newInstance( 1001,19,"王一一","男");


    4.如何使用反射操作属性?


    操作属性基本步骤:
    1.通过Class对象获取Field(属性)对象;
    2.调用Field对象的方法操作属性;

    代码示例:
    Class<User> clazz=(Class<User>)Class.forName("cn.bjsxt.bean.User");

    //获得User类里属性名为”name”的属性并将其封装成一个Field对象name,接下来可//以用name调用Field的方法来操作属性;(略)
    Field name=clazz.getField(“name”);

    通过Class对象获得属性的方法有:
    获取public的属性:object.getFields()
    获取所有的属性: object.getDeclaredFields()
    根据属性名称获取public的属性信息: object.getField(“sex”);
    根据属性名称获取属性的信息:object.getDeclaredField(“name”);

    5.如何使用反射执行方法?


    调用方法基本步骤:
    1.通过Class对象获取Method 对象;
    2.调用Method对象的invoke()方法;

    代码示例:
    Class<User> clazz=(Class<User>)Class.forName("cn.bjsxt.bean.User");
    User u=clazz.newInstance();
    Method m2=clazz.getDeclaredMethod("show", String.class);
    Object o=m2.invoke(u, "大家好");
    System.out.println(o);

    6.反射的优缺点有哪些?


    优点:
    反射提高了Java程序的灵活性和扩展性,降低耦合性,提高自适应能力。它允许程序创建和控制任何类的对象,无需提前硬编码目标类。
    反射是其它一些常用语言,如C、C++、Fortran 或者Pascal等都不具备的。
    Java反射技术应用领域很广,如软件测试、 EJB、JavaBean等。
    许多流行的开源框架例如Struts、Hibernate、Spring在实现过程中都采用了该技术。

    缺点:
    性能问题:
    使用反射基本上是一种解释操作,字段和方法接入时要远慢于直接代码。因此Java反射机制主要应用在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用。
    使用反射会模糊程序内部逻辑:
    程序人员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂。


    7.【上机】使用反射模拟请求调用不同的Servlet实例。

  • 相关阅读:
    Python学习之余,摸摸鱼
    Python 实现斐波那契数
    Linux下为什么目录的大小总是4096
    Python的精髓居然是方括号、花括号和圆括号!
    为什么说Python是最伟大的语言?看图就知道了!
    前端常用知识(会更新)
    Mysql 约束
    Navicat 安装
    Java后台将CTS格式转为标准日期时间格式返回给前端
    MySQL数据库报错“Zero date value prohibited”
  • 原文地址:https://www.cnblogs.com/ren549047861/p/11294301.html
Copyright © 2020-2023  润新知