我找不到任何解释为什么从Apache Lang3 v3.7弃用StringEscapeUtils的原因.
我们现在应该使用什么来进行HTML转义/转义
java apache-commons apache-commons-lang apache-commons-lang3
我一直在负责使用更新我们的代码org.apache.commons.lang来org.apache.commons.lang3和我发现,新版本StringEscapeUtils不再有法escapeJavaScript()但我们是在我们整个代码不少地方用这个.
我一直在阅读文档,看起来整个都StringEscapeUtils被重写了lang3(参见发行说明lang 3.3.2),并且他们删除了这些重写,escapeJavaScript()但他们没有说明在任何文档中使用什么作为替代(不是我能看到的).这是什么新文档.
所以我的问题是我不能成为唯一一个注意到这一点并且经历过这个问题的人,那么使用什么替代方案StringEscapeUtils.escapeJavaScript()呢?
我一直都知道Java中有两种类型的相等,
.equals()方法测试两个对象是否在非null对象引用上实现等价关系.==运算符来测试两个基本类型或内存位置是否相等.以下几页更详细地描述了这些语言基础知识.
这两个链接没有明确指定的是,如果比较两个null对象引用的值相等,应该会发生什么.隐含的假设是NullPointerException应该抛出a,但这不是ObjectUtils.equals()方法所做的,这可能被认为是最佳实践效用方法.
令我担心的是,Apache Commons似乎已经在后门有效地引入了第三种平等的Java,并且已经令人困惑的事态可能会变得更加复杂.我称之为平等的第三个衡量标准,因为它试图测试值的相等性,当它失败时,它又回到测试参考相等性.Apache Commons相等测试与值相等和引用相等有许多相似之处,但也有明显的不同.
我是否有权利关注并希望避免使用ObjectUtils.equals()尽可能的地方?
有没有争论要求ObjectUtils.equals()提供其他两种平等衡量标准的有用联合?
似乎没有就这个问题达成共识意见,但我决定将Bozho标记为正确,因为他最好将我的注意力吸引到我现在认为是无效安全等于检查的最大问题.我们都应该编写快速失败的代码,解决为什么要比较两个空对象的价值平等的根本原因而不是试图在地毯下扫描问题.
我有一个包含许多变量的对象,但其中一个是byteArray,例如
public class DataWithFields {
private String string1;
private String string2;
....
private byte[] data
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}
}
Run Code Online (Sandbox Code Playgroud)
对于上面的代码,我想从toString中排除数据变量,而不必显式定义每个值.我该怎么做呢?
Apache的StringUtils.isNumeric()方法规范说:
检查String是否只包含unicode数字.小数点不是unicode数字并返回false.
Null会回来的false.空的String ("")将返回true.
这在逻辑上是对的吗?为什么他们将空字符串视为数字?
我正在使用依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我有以下对象:
public Class X {
private String a;
private String b;
private Y y;
}
public Class Y {
private String c;
private String d;
}
Run Code Online (Sandbox Code Playgroud)
我需要递归地记录类X的内容以获得类Y并使用JSON样式.这是我的目标,这就是这个问题的目的.
方法1:
ToStringStyle style = ToStringStyle.JSON_STYLE;
LOGGER.debug(ReflectionToStringBuilder.toString(new X(), style, false, false));
Run Code Online (Sandbox Code Playgroud)
方法1结果:
{"a":"<a>","b":"<b>","y": com.<packages>.y@<hash>}
Run Code Online (Sandbox Code Playgroud)
方法2:
RecursiveToStringStyle style = new RecursiveToStringStyle();
LOGGER.debug(ReflectionToStringBuilder.toString(new X(), style, false, false));
Run Code Online (Sandbox Code Playgroud)
方法2结果:
[com.<packages>.x@<hash>[a=<a>,b=<b>,y=com.<packages>.y@<hash>[c=<c>,d=<d>]]
Run Code Online (Sandbox Code Playgroud)
成功的方法:
`Merge of Approach 1 and Approach 2` but how to achieve this?
Run Code Online (Sandbox Code Playgroud)
成功的方法结果(我的目标):
{"a":"<a>","b":"<b>","y":{"c":"<c>","d":"<d>"}}
Run Code Online (Sandbox Code Playgroud) 我已经开始将commons.lang 2迁移到commons.lang3.
根据 https://commons.apache.org/proper/commons-lang/article3_0.html
StringEscapeUtils.escapeSql
这是一种误导性的方法,只处理最简单的SQL案例.>由于SQL不是Lang的重点,因此维护此方法没有意义.
理解它,但建议使用什么而不是它?
澄清
你能推荐第三方执行类似于StringEscapeUtils.escapeSql的简单escapeSql吗?
我试图使用字符'X'掩盖信用卡号码字符串中的字符.我写了两个函数如下.第二个函数使用commons.lang.StringUtils类.我试图找到两种情况下的时间
public static String maskCCNumber(String ccnum){
long starttime = System.currentTimeMillis();
int total = ccnum.length();
int startlen=4,endlen = 4;
int masklen = total-(startlen + endlen) ;
StringBuffer maskedbuf = new StringBuffer(ccnum.substring(0,startlen));
for(int i=0;i<masklen;i++) {
maskedbuf.append('X');
}
maskedbuf.append(ccnum.substring(startlen+masklen, total));
String masked = maskedbuf.toString();
long endtime = System.currentTimeMillis();
System.out.println("maskCCNumber:="+masked+" of :"+masked.length()+" size");
System.out.println("using StringBuffer="+ (endtime-starttime)+" millis");
return masked;
}
public static String maskCCNumberCommons(String ccnum){
long starttime = System.currentTimeMillis();
int total = ccnum.length();
int startlen=4,endlen = 4;
int masklen = total-(startlen + …Run Code Online (Sandbox Code Playgroud) 我必须在日志文件中打印对象值.我用了:
ReflectionToStringBuilder.toString(this, ToStringStyle.MULTI_LINE_STYLE, true, true);
Run Code Online (Sandbox Code Playgroud)
但它也打印出我不想包含的空值,例如:
Pojo @ 117d9a3 [id = 1,name = null,description =曼联,KEY = APP-KEY,secretKey = Alex]
如何抑制包含空值?
在Java 8之前,我们实现Comparable.compareTo(...)如下:
public int compare(Person a, Person b) {
return new CompareToBuilder()
.append(a.getLastName(), b.getLastName())
.append(a.getFirstName(), b.getFirstName())
.toComparison();
}
Run Code Online (Sandbox Code Playgroud)
从Java 8开始,我们可以这样做:
public int compare(Person a, Person b) {
return Comparator
.comparing(Person::getLastName)
.thenComparing(Person::getFirstName)
.compare(a, b);
}
Run Code Online (Sandbox Code Playgroud)
新的Java 8方式可能允许我们放弃commons-lang3依赖.这种新的Java 8更快吗?有没有办法自动迁移?我没有找到IntelliJ的意图.
请注意,当存在反向订单并且涉及非自然比较时,它会变得有点复杂:
public int compare(SingleBenchmarkResult a, SingleBenchmarkResult b) {
return new CompareToBuilder()
.append(b.hasAnyFailure(), a.hasAnyFailure()) // Reverse
.append(a.getAverageScore(), b.getAverageScore(), resilientScoreComparator)
.toComparison();
}
Run Code Online (Sandbox Code Playgroud)
变
public int compare(SingleBenchmarkResult a, SingleBenchmarkResult b) {
return Comparator
.comparing(SingleBenchmarkResult::hasAnyFailure, Comparator.reverseOrder()) // Reverse
.thenComparing(SingleBenchmarkResult::getAverageScore, resilientScoreComparator)
.compare(a, …Run Code Online (Sandbox Code Playgroud) intellij-idea comparator java-8 apache-commons-lang apache-commons-lang3
java ×9
comparator ×1
equality ×1
equals ×1
java-8 ×1
masking ×1
reflection ×1
string ×1
tostring ×1