java8自带的参数校验的简单介绍

博主:adminadmin 2022-11-23 03:38:04 65

本篇文章给大家谈谈java8自带的参数校验,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

常用JVM参数(JDK 8)

-Xss :线程栈空间

-Xms : 初始堆空间,如: -Xms512M

-Xmx : 最大堆空间,如: -Xmx512M

-XX:MinHeapFreeRatio : 堆空间最小空闲比,当堆空间空闲内存小于这个数值时,JVM会扩展堆空间。

-XX:MaxHeapFreeRatio : 堆空间最大空闲比,当堆空间空闲内存大于这个数值时,JVM会压缩堆空间,得到一个较小的堆。

-XX:NewSize : 新生代初始空间

-XX:MaxNewSize : 最大新生代空间

-Xmn : 相当于设置相同的 -XX:NewSize 和 -XX:MaxNewSize .

-XX:SurvivorRatio : 新生代中eden空间和s0空间的比例

-XX:TargetSurvivorRatio : survivor区的可使用率,当survivor区的空间使用率达到这个数值时,会将对象送入老年代。

-XX:NewRatio : 老年代 / 新生代的空间比例

-XX:MetaspaceSize=512m : 分配给类元数据空间的初始大小,以bytes为单位,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当的降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize(如果设置了的话),适当的提高该值。

-XX:MaxMetaspaceSize=512m : 分配给类元数据空间的最大值, 超过此值就会触发Full GC. 此值仅受限于系统内存的大小, JVM会动态地改变此值

-XX:MinMetaspaceFreeRatio ,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为class metadata分配空间导致的垃圾收集。

-XX:MaxMetaspaceFreeRatio ,在GC之后,最大的Metaspace剩余空间容量的百分比,减少为class metadata释放空间导致的垃圾收集。

-XX:CompressedClassSpaceSize=512m : 类指针压缩空间大小, 默认为1G

-XX:+PrintGCDetails : 打印GC细节

-XX:+PrintGC :

-XX:+PrintGCTimeStamps :

-XX:+PrintHeapAtGC :

Java 8 以前的JVM内存结构图:

其中:

虚拟机栈 在运行时使用 栈帧 保存上下文,栈帧中存储了以下内容:

更为精细地, 堆 和 方法区 的结构如下:

堆 分为 新生代 和 老年代 .

新生代 分为 Eden区 、 s0区(survivor space0或from space) 和 s1区(survivor space1或to space) 。

大部分新创建的对象进入Eden区,幸存区s0区和s1区存放经历了至少一次GC的“幸存者”。如果幸存区中的对象到了指定年龄仍未被回收,则有机会进入 老年代(tenured)

对于习惯了HotSpot虚拟机的程序员来说,很多都愿意将 方法区 称作 永久代 。本质上来讲两者并不等价,仅因为Hotspot将GC分代扩展至方法区,或者说使用永久代来实现方法区。在其他虚拟机上是没有永久代的概念的。也就是说方法区是Java虚拟机规范,永久代是Hotspot针对该规范进行的实现。

堆 和 方法区 都是被JVM中所有线程共享的。

Java 8以后的JVM内存结构图:

Java8中,Hotspot取消了永久代,永久代的参数 -XX:PermSize 和 -XX:MaxPermSize 也随之失效。

对于Java8,HotSpots取消了永久代,是不是就没有方法区了呢?当然不是,方法区只是一个规范,只不过它的实现变了。

在Java8中, 方法区存在于元空间(Metaspace) 。同时,元空间不再与堆连续,而且是存在于本地内存(Native memory)。

本地内存(Native memory) ,也称为 C-Heap ,是供JVM自身进程使用的。当Java Heap空间不足时会触发GC,但本地内存空间不够却不会触发GC。

元空间存在于本地内存,意味着只要本地内存足够,它不会出现像永久代中 java.lang.OutOfMemoryError: PermGen space 这种错误。默认情况下元空间是可以无限使用本地内存的,但JVM同样提供了参数 -XX:MaxMetaspaceSize 来限制它使用的空间。

java中验证字符串是不是数字的四种方法

判断字符串是不是数字,大家可能会用一些java自带的方法,也有可能用其他怪异的招式,比如判断是不是整型数字,将字符串强制转换成整型,不是数字的就会抛出错误,那么就不是整型的了。但本文介绍的比较好的两种方法:

1。java类库自带的方法:

public boolean isNum(String msg){

if(java.lang.Character.isDigit(msg.charAt(0))){

return true;}return false;}0202更新:发现以上方法写得不够到位,现在就改为下面的简单说明了,至于具体的方法实现字符串判断是否数字就不写了。

java.lang.Character.isDigit(char ch) boolean

isDigit 只能作用于char,所以判断字符串是否为数字,要一个一个拿出char进行判断。

2。用正则表达式

首先要import java.util.regex.Pattern 和 java.util.regex.Matcher

这两个包,接下来是代码

public boolean isNumeric(String str){Pattern pattern = Pattern.compile(”[0-9]*”);

Matcher isNum = pattern.matcher(str);

if( !isNum.matches() ){return false;}return true;}02

3。用正则表达式

如何使用java validation api进行参数校验

JAVA中通过Hibernate-Validation进行参数验证

在开发JAVA服务器端代码时,我们会遇到对外部传来的参数合法性进行验证,而hibernate-validator提供了一些常用的参数校验注解,我们可以拿来使用。

1.maven中引入hibernate-validator对应的jar:

dependency

groupIdorg.hibernate/groupId

artifactIdhibernate-validator/artifactId

version4.3.1.Final/version

/dependency

2.在Model中定义要校验的字段(即该字段不能为空,并且最大长度为14):

import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.NotEmpty;

public class PayRequestDto {

/**

* 支付完成时间

**/

@NotEmpty(message="支付完成时间不能空")

@Size(max=14,message="支付完成时间长度不能超过{max}位")

private String payTime;

public String getPayTime() {

return payTime;

}

public void setPayTime(String payTime) {

this.payTime = payTime;

}

}

3.定义Validation工具类:

import java.util.Set;

import javax.validation.ConstraintViolation;

import javax.validation.Validation;

import javax.validation.Validator;

import org.hibernate.validator.HibernateValidator;

import com.atai.framework.lang.AppException;

public class ValidationUtils {

/**

* 使用hibernate的注解来进行验证

*

*/

private static Validator validator = Validation

.byProvider(HibernateValidator.class).configure().failFast(true).buildValidatorFactory().getValidator();

/**

* 功能描述: br

* 〈注解验证参数〉

*

* @param obj

* @see [相关类/方法](可选)

* @since [产品/模块版本](可选)

*/

public static T void validate(T obj) {

SetConstraintViolationT constraintViolations = validator.validate(obj);

// 抛出检验异常

if (constraintViolations.size() 0) {

throw new AppException("0001", String.format("参数校验失败:%s", constraintViolations.iterator().next().getMessage()));

}

}

}

4.在代码中调用工具类进行参数校验:

ValidationUtils.validate(requestDto);

以下是对hibernate-validator中部分注解进行描述:

@AssertTrue 用于boolean字段,该字段只能为true

@AssertFalse 该字段的值只能为false

@CreditCardNumber 对信用卡号进行一个大致的验证

@DecimalMax 只能小于或等于该值

@DecimalMin 只能大于或等于该值

@Digits(integer=,fraction=) 检查是否是一种数字的整数、分数,小数位数的数字

@Email 检查是否是一个有效的email地址

@Future 检查该字段的日期是否是属于将来的日期

@Length(min=,max=) 检查所属的字段的长度是否在min和max之间,只能用于字符串

@Max 该字段的值只能小于或等于该值

@Min 该字段的值只能大于或等于该值

@NotNull 不能为null

@NotBlank 不能为空,检查时会将空格忽略

@NotEmpty 不能为空,这里的空是指空字符串

@Null 检查该字段为空

@Past 检查该字段的日期是在过去

@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式

@Range(min=,max=,message=) 被注释的元素必须在合适的范围内

@Size(min=, max=) 检查该字段的size是否在min和max之间,可以是字符串、数组、集合、Map等

@URL(protocol=,host,port) 检查是否是一个有效的URL,如果提供了protocol,host等,则该URL还需满足提供的条件

@Valid 该注解主要用于字段为一个包含其他对象的集合或map或数组的字段,或该字段直接为一个其他对象的引用,这样在检查当前对象的同时也会检查该字段所引用的对象

关于java8自带的参数校验和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-11-23,除非注明,否则均为首码项目网原创文章,转载请注明出处。