当前位置: 首页 > news >正文

保洁公司网站怎么做减肥单页网站

保洁公司网站怎么做,减肥单页网站,wordpress主题开发博客,贵阳网站建设宏思锐达1. 什么是反射? 首先听这个名字就有些疑惑,什么是反射,它能用来干什么呢? Java官方对反射的解释是 "反射允许对封装类的字段,方法和构造函数进行编程式访问"。这里的字段指的就是成员变量,方法…

1. 什么是反射?

首先听这个名字就有些疑惑,什么是反射,它能用来干什么呢?

Java官方对反射的解释是 "反射允许对封装类的字段,方法和构造函数进行编程式访问"。这里的字段指的就是成员变量,方法指的就是成员方法,构造函数就是构造方法。        

2. 反射有什么用?

我们知道,在类中,常用的有字段,构造方法,成员方法。我们的反射就是可以把一个类中所有的字段,构造方法,成员方法全部都获取出来。那么问题又来了,获取出来有什么用呢?

反射用途还是很多的,我们熟知的IDEA开发工具,他可以在我们编写代码时自动给出提示,提示我们有哪些方法可以用,有哪些构造器可以使用,它是怎么做到的呢?说到这里,不难猜出,它其实就是用的反射。

还有如下所示,我们 new 一个对象,但忘记了它可以传递哪些参数,这个时候我们按键盘上的 Ctrl + P 键,它就会自动弹出提示我们需要传递哪些参数,这个其实也使用反射做到的。

刚才我们说到了, 反射就是可以把一个类中所有的字段,构造方法,成员方法全部都获取出来。

不仅如此,通过反射我们可以获取的非常全面,非常详细,我们甚至可以获取到。

当我们获取字段(变量)时,不仅可以获取到该变量,还能获取到该变量的访问修饰符,名字,类型,并可以为它赋值或者获取初始值;

当我们获取构造方法时,不仅可以获取到构造方法,还能获取到修饰符,名字,形参,还可以创建对象;

当我们获取成员方法时,不仅可以获取到成员方法,也能获取到该方法的修饰符,名字,形参,还能获取方法的返回值,抛出的异常,以及方法上的注解也能获取到,可以说是有什么就能获取到什么,一点不剩的全都可以拿到。

此外有一点要知道,我们获取字段,构造方法,成员方法不是通过Java文件来获取的,而是通过  Class 字节码文件中获取的。

总的来说可以理解为一句话:通过反射我们可以获取到类中的所有信息。

3. 获取 Class 字节码文件对象的三种方式(重中之重,面试会问)

3.1 Class.forName("全类名")方式获取;

其实这种方式应该并不陌生,如果有小伙伴学过JDBC的,应该都大致了解过,通过Class.forName("com.mysql.jdbc.Driver")来获取该类的字节码文件对象。

下面我简单演示一下吧

如下是一个JavaBean类 Account 

package cn.itcast.user.pojo;import java.io.Serializable;public class Account implements Serializable {private static final long serialVersionUID = -421643127452356642L;// 账户idprivate Integer accountId;// 账户人名称private String accountName;// 账户密码private transient String accountPassword;public Account(Integer accountId, String accountName, String accountPassword) {this.accountId = accountId;this.accountName = accountName;this.accountPassword = accountPassword;}public Account() {}@Overridepublic String toString() {return "Account{" +"accountId=" + accountId +", accountName='" + accountName + '\'' +", accountPassword='" + accountPassword + '\'' +'}';}public Integer getAccountId() {return accountId;}public void setAccountId(Integer accountId) {this.accountId = accountId;}public String getAccountName() {return accountName;}public void setAccountName(String accountName) {this.accountName = accountName;}public String getAccountPassword() {return accountPassword;}public void setAccountPassword(String accountPassword) {this.accountPassword = accountPassword;}
}

然后我定义一个 main 方法,通过 Class.forName() 的方式来获取,代码如下

public static void main(String[] args) {// 这里可能或出现异常,由于是 main 方法中,最好用 try。。。catch,,,捕获try {System.out.println(Class.forName("cn.itcast.user.pojo.Account"));;} catch (ClassNotFoundException e) {e.printStackTrace();}}

我们直接运行此方法,就可以在控制台得到 Account 类的字节码文件对象,如下所示

3.2 类名.class 方式获取

操作方法如下代码

可以看到也没有任何问题,我就不多做解释了;

3.3 对象.getClass() 方式获取

这里必须是想要反射的类的对象,谁调用getClass,得到的就是谁的类对象。如下代码展示

还有一点可以注意一下,getClass() 方法是定义在 Obeject 类中的,所以所有的对象都可以使用此方法。

3.4 三种方式的通常应用场景

如果我想创建一个类的对象,分为以下三种阶段,每一个阶段都有它适当使用的场景。

阶段一:编写Java文件,将Java文件编写成字节码文件,这个阶段也被称为源代码阶段,可以使用 Class.forName() 的方式来获取;

阶段二:当我们把字节码文件加载到内存中准备运行的时候,可以称为加载阶段,这个阶段通常采用 类名.class 的方式获取字节码文件对象;

阶段三:在内存中运行时,我可以创建类对象,这个阶段也被称为运行阶段,通常采用 对象.getClass() 的方式获取字节码文件对象;

4. 利用反射获取构造方法

获取类的字节码文件之后,我们就可以通过字节码文件对象获取构造方法,我们可以获取单个构造器,可以获取所有构造器,还能创建对象。
如下图所示,即为获取构造方法的方法,我们简单测试一下;

如下代码,实体类 Account,我定义了多个构造器,注释如下

public class Account implements Serializable {private static final long serialVersionUID = -421643127452356642L;// 账户idprivate Integer accountId;// 账户人名称private String accountName;// 账户密码private transient String accountPassword;// 全参构造器public Account(Integer accountId, String accountName, String accountPassword) {this.accountId = accountId;this.accountName = accountName;this.accountPassword = accountPassword;}// 一个参数的构造器public Account(Integer accountId) {this.accountId = accountId;}// 两个参数的构造器public Account(Integer accountId, String accountName) {this.accountId = accountId;this.accountName = accountName;}// 无参构造器public Account() {}
}

然后我们去 main 方法中测试通过反射获取构造器,代码和注释如下

public class Test01{public static void main(String[] args) {// 需要先定义一个 Account 类的对象Account account = new Account();// 根据对象获取类的字节码文件Class clazz = account.getClass();try {// 获取参数类型为 Integer 的构造器Constructor con = clazz.getConstructor(Integer.class);// 打印输出该构造器System.out.println(con);} catch (NoSuchMethodException e) {e.printStackTrace();}System.out.println("----------------------------------------------");// 构造器本身也是一个对象,这里我们获取多个构造器,用列表进行接收Constructor[] constructors = clazz.getConstructors();// 输出获取到的所有构造器System.out.println(constructors);}
}

运行 main 方法,得到如下结果

在获取到类的字节码文件之后,我们不仅可以向上面那样获取到构造方法,还可以获取到更为详细的信息

在上图中可以看到,IDEA给出了大量的提示,我挑几个来说一下可以干什么

getParameterConunt() 获取参数个数;

getParameterTypes()  获取参数类型;

getParameter() 获取所有参数;

getModifiers() 获取该方法的权限修饰符,如 public,private,但返回的值是整数,如果返回1,则说明为public,若返回2,则为private。

看他们的英文名字就能大概了解了,我们的IDEA自动提示功能就是通过这些功能来做到的!

5. 利用反射获取属性

利用反射我们也可以获取到类中的属性,例如刚才的 Account 类,我们可以获取到它的 账户id,账户名称,账户密码等属性,相应方法如下所示

 我们还是需要先获取类的字节码文件,再通过字节码文件的方法获取类中的属性,如下所示

我这里是获取所有的,当然也可以获取单个的,将方法的后缀 s 去掉就可调用获取单个属性的方法,它也和刚才的构造方法一样,可以获取属性的修饰符,还可以获取到属性的变量名,这里就不重复演示了。 

6. 通过反射获取成员方法

如下图中所示的即为获取成员方法的方法,我们也是要通过字节码文件对象来获取

  我们把刚才的 Account 类添加上 get和set方法

通过字节码文件即可获取 get 和 set 方法

还有几个方法我就不一一展示了,也都不难。

其实反射这一章在开发时并不常用,他们主要是应用与框架,如果以后你自己也开发框架的话,会经常用到反射。

另外,获取Class字节码文件的三种方法是面试时常常问到的一个点,各位需要好好记住。

http://www.yayakq.cn/news/832213/

相关文章:

  • 织梦搬家 网站空白餐饮会员管理系统
  • 生成短链接的网站小说小程序搭建
  • 宝安公司可以网站设计wordpress 墙
  • 门户网站与官网的区别国际物流公司网站
  • 甜点网站建设的功能及意义溧阳做网站价格
  • 个人网站怎么建立网站空间分类
  • 建设网站如何赢利中国成熟iphone
  • 支付宝也做网站吗php做的商城网站必备功能
  • 学校网站建设评比网站开发工程师 上海
  • 大连建设学校网站什么人最需要建设网站
  • 做网站想要个计算器功能室内设计中文网
  • 官方网站建设优化南京市的网站是由那几家公司做的
  • 响应式网站效果图做多大的国家中小企业公共服务平台
  • 怎么联系企业的网站建设福州百度快速优化排名
  • 淘客没有网站难做做民宿最大的网站
  • 国内p2p网站建设肇庆做网约车
  • 静态网站开发课程网wordpress 标签 中文乱码
  • 网站维护入门教程怎么查网站做404页面没
  • h5模板网站有哪些企业网站开发总结
  • 动易手机网站模板全国新冠疫苗接种率
  • 建设工程抗震管理条例重庆网站seo营销模板
  • 哈尔滨做网站哪家便宜爱星光(istar)高端网站建设
  • 学做室内效果图的网站wordpress 作者简介
  • 天津企业网站设计报价装修公司网站dede模板
  • 网站内容该怎么做手机商城下载安装
  • 安徽通皖建设工程有限公司网站电子商务网站策划书
  • 永久免费网站推荐开源 企业网站
  • 四川省铁路建设有限公司网站住房和城乡建设厅官网查询
  • 黄冈网站推广策略甘肃省环保建设申报网站
  • 英文服装商城网站建设社团网站模板