下面的程序被设计用来打印它的类文件的名称。如果你不熟悉类字面常量,那么我告诉你Me.class.getName()将返回Me类完整的名称,即“com.javapuzzlers.Me”。那么,这个程序会打印出什么呢?


package com.javapuzzlers;public class Me {public static void main(String[] args){ System.out.println( Me.class.getName(). replaceAll(".","/") + ".class"); } } 

该程序看起来会获得它的类名(“com.javapuzzlers.Me”),然后用“/”替换掉所有出现的字符串“.”,并在末尾追加字符串“.class”。你可能会认为该程序将打印com/javapuzzlers/Me.class,该程序正式从这个类文件中被加载的。如果你运行这个程序,就会发现它实际上打印的是///.class。到底怎么回事?难道我们是斜杠的受害者吗?

问题在于String.replaceAll接受了一个正则表达式作为它的第一个参数,而并非接受了一个字符序列字面常量。(正则表达式已经被添加到了Java平台的1.4版本中。)正则表达式“.”可以匹配任何单个的字符,因此,类名中的每一个字符都被替换成了一个斜杠,进而产生了我们看到的输出。

要想只匹配句点符号,在正则表达式中的句点必须在其前面添加一个反斜杠(\)进行转义。因为反斜杠字符在字面含义的字符串中具有特殊的含义——它标识转义字符序列的开始——因此反斜杠自身必须用另一个反斜杠来转义,这样就可以产生一个转义字符序列,它可以在字面含义的字符串中生成一个反斜杠。把这些合在一起,就可以使下面的程序打印出我们所期望的com/javapuzzlers/Me.class:


package com.javapuzzlers;public class Me {public static void main(String[] args){ System.out.println( Me.class.getName().replaceAll("\\.","/") + ".class"); } } 

为了解决这类问题,5.0版本提供了新的静态方法java.util.regex.Pattern.quote。它接受一个字符串作为参数,并可以添加必需的转义字符,它将返回一个正则表达式字符串,该字符串将精确匹配输入的字符串。下面是使用该方法之后的程序:


package com.javapuzzlers;import java.util.regex.Pattern;public class Me {public static void main(String[] args){ System.out.println(Me.class.getName(). replaceAll(Pattern.quote("."),"/") + ".class"); } } 

该程序的另一个问题是:其正确的行为是与平台相关的。并不是所有的文件系统都使用斜杠符号来分隔层次结构的文件名组成部分的。要想获取一个你正在运行的平台上的有效文件名,你应该使用正确的平台相关的分隔符号来代替斜杠符号。这正是下一个谜题所要做的。

转载于:https://www.cnblogs.com/yuyu666/p/9840411.html

谜题20:我的类是什么?相关推荐

  1. Java学习笔记20(String类应用、StringBuffer类、StringBuilder类)

    1.获取指定字符串中大小写和数字的个数: package demo;public class StringTest {public static void main(String[] args) {g ...

  2. java collections_[20]-Collections工具类

    集合转换为数组 数组转换为集合 package Collections工具类的使用 专门用来操作集合的工具类. 构造方法私有,禁止创建对象 提供一系列静态方法实现对各种集合的操作具体操作:搜索.复制. ...

  3. Java学习20天 String 类 常用方法 String、StringBuffer、StringBuilder三者的异同

    String 类 String:字符串,使用一对""引起来表示. 1.String声明为finaL的,不可被继承 2.String实现了SerializabLe接口:表示字符串是支 ...

  4. 计算机学报和软件学报19~20年测试类相关论文

    软件学报,2019年第1期,关于"软件学科发展回顾特刊"值得一看. "中国计算机学会"的"数字图书馆"下的期刊列表. 未知协议的逆向分析与自 ...

  5. 7.20在学生类student和教师类teacher 基础上再派生出一个助教类

    /*在学生类student和教师类teacher基础上 再派生出一个助教类TeachAssistant,一个助教既具有教师的特征, 又具有学生的特征,还有自己的新特征:工资(wage). 要求将助教类 ...

  6. Java解惑 电子书

    --表达式谜题 Java 谜题 1--表达式谜题 谜题 1:奇数性 下面的方法意图确定它那唯一的参数是否是一个奇数.这个方法能够正确运转 吗? public static boolean isOdd( ...

  7. 学好顶级算法谜题,不再为了编程而编程

    谜题趣味非凡.顶级谜题的解可没那么浅显易得,需要灵光一闪才能发现.算法谜题是指谜题的解法就是算法,解题的步骤可以被机器自动执行.算法可以用英文或者其他任何自然语言来描述,但是为了更加精确,往往会用伪代 ...

  8. java用构造方法定义book类_JAVA基础学习之路(三)类定义及构造方法

    类的定义及使用 一,类的定义 classBook {//定义一个类intprice;//定义一个属性intnum;public static int getMonney(int price, intn ...

  9. Java基础-Date类常用方法介绍

    Java基础-Date类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.毫秒值概念 我们在查阅Date类的API文档时,会发现这样的一句话:"The cl ...

最新文章

  1. CV进入三维时代!Facebook在ICCV 2021 发布两个3D模型,自监督才是终极答案?
  2. 自定义HTTP标头:命名约定
  3. Oracle Length 和 Lengthb 函数说明 .(用来判断记录值里是否有中文内容)
  4. html5图片怎么顶格,iQOO 5系列几乎达到了“顶格”的性能状态。
  5. Python学习之路:多态实例
  6. Nuget如何自动下载依赖DLL引用
  7. 作品上传设计师交流社区,从而获得很好的传播效果
  8. 阿里安全的“自动逆向机器人”TimePlayer 究竟是什么
  9. hdu 2986 Ballot evaluation (Simulation)
  10. 转载--#define 用法
  11. OpenGL超级宝典(第7版)笔记10 片段着色器 清单3.10-3.12
  12. 字符集 (ASCII、GBK、UTF-8、编码方案,解码方案、乱码等问题)
  13. 多种文件上传绕过手法
  14. 华表Cell的网页插件在IE8中无法显示的问题 | #华表Cell #报表 #IE8
  15. GPS: 经纬度概念
  16. 二元二次方程例题_2元1次方程100道题 七年级数学下册二元二次方程组100道计算题及答案!......
  17. 暴走英雄坛服务器维修,暴走英雄坛采集位置及注意事项一览
  18. 登陆163邮箱 验证邮箱帐号密码是否正确
  19. AirPods pro 连接Macbook pro左耳无声音
  20. matlab求偏转角,轮胎的回正力矩——侧偏角特性计算实例

热门文章

  1. 数据分析:大数据时代的必备技能之Tableau
  2. 别找了,完整代码在这||校园导游咨询系统
  3. QCombobox组合框的样式
  4. 循环获取控制台输入scanner.nextLine()问题
  5. 《数据结构与算法》(十一)- 树、森林与二叉树的转换及哈夫曼树详解
  6. java测试单个方法 @Test
  7. Mysql数据库优化的目的和从那放几个方面进行优化
  8. 论文笔记(3):Tensor Decompositions and Applications
  9. uni-app 介绍及使用
  10. linux服务器黑屏_IBM服务器安装、进入Linux系统时显示花屏、黑屏的解决办法