
华为Mate 40 Pro+后置摄像头:超感知摄像头5000万像素+自由曲面**摄像头2000万像素+长焦摄像头1200万像素+超级变焦摄像头800万像素+3D深感摄像头,支持自动对焦。
在日常接口测试中,总会遇到获取token值的情况,比如通过登录接口返回的token,使用此token作为凭据访问系统里面的其它接口,这时我们就需要获取到登录接口返回的值,把token信息提取出来,然后保存起来给别的请求使用,或者做一些其它处理。
下面的这个例子讲解,如何通过正则表达式的方法获取参数值,首先需要先了解下相关语法,之后在进行实践。下示例中,要求提取登录接口的token、userid、username、unixtime等信息,介绍用正则表达式的方式来实现,提取一个,一次提取多个。
一、正则表达式语法
()括起来的部分就是要提取的
匹配任何字符串
+ 一次或多次
? 在找到第一个匹配项后停止
例如想匹配web页面的如下部分,<title> 正则表达式例子</title> 提取语法:<title> (+)</title>
使用场景:第二个请求参数中需要加入第一个请求的返回值时;通过正则提取器可以提取第一个请求返回值中指定的字段信息并赋值在第二个接口里面。
小技巧,想要看到变量,取样器—Debug Sampler 调试器,会把变量打印出来。
二、实践例子
第一步:例如有以下登录接口,在第一个接口成功之后,需要提取token、userid等参数
第二步:在需要提取数据的接口 右击 --》添加 --》后置处理器 --》正则表达式提取器
第三步:用正则提取:响应结果种单个字段值,设置变量名,设置左右边界(+)表示匹配任意长度
第四步:查看正则表达式,提取的相关变量值
华为nova 8后置四摄:6400万像素(f/19光圈)+800万像素(超广角,f/24光圈)+200万像素(f/24光圈)+200万像素(f/24光圈),支持自动对焦(相位对焦/反差对焦)。前置摄像头像素:3200万。拍照拍视频都特别好!
S6后置配以4800万像素主摄像头+800万像素广角摄像头+200万像素微距摄像头+200万像素虚化摄像头,,F/179(后置主摄),F/22(后置广角),F/24(后置微距)、F/24(后置虚化)光圈。
更多疑惑,可进入vivo官网/vivo商城APP--我的--在线客服或者点击网页链接,输入人工客服进入咨询了解。
Vivox90后置摄像头参数:
Vivox90后置摄像头采用了1/3英寸CMOS传感器,支持1920×1080的最大分辨率,最大支持30帧的视频拍摄,支持H264/H265视频编码,支持AAC音频编码,支持多种曝光模式,支持自动对焦、自动白平衡、自动曝光补偿等功能,支持多种视频模式,支持多种图像处理功能,支持曝光补偿、曝光锁定、色彩增强、降噪等功能,支持自动曝光、自动对焦、自动白平衡等功能,支持多种视频模式,支持多种图像处理功能,支持曝光补偿、曝光锁定、色彩增强、降噪等功能,支持多种图像格式,支持多种图像处理功能,支持自动曝光、自动对焦、自动白平衡等功能,支持多种视频模式,支持多种图像处理功能,支持曝光补偿、曝光锁定、色彩增强、降噪等功能,支持多种图像格式,支持多种图像处理功能,支持自动曝光、自动对焦、自动白平衡等功能,支持多种视频模式,支持多种图像处理功能,支持曝光补偿、曝光锁定、色彩增强、降噪等功能,支持多种图像格式,支持多种图像处理功能,支持自动曝光、自动对焦、自动白平衡等功能,支持多种视频
所谓jvm垃圾回收机制其实就是相较于于c、c++语言的优势之一是自带垃圾回收器,垃圾回收是指不定时去堆内存中清理不可达对象。垃圾收集器在一个Java程序中的执行是自动的,不能强制执行,程序员唯一能做的就是通过调用Systemgc 方法来建议执行垃圾收集器。
先说注解,使用注解配置Spring AOP总体分为两步,第一步是在xml文件中声明激活自动扫描组件功能,同时激活自动代理功能(同时在xml中添加一个UserService的普通服务层组件,来测试AOP的注解功能):
<xml version="10" encoding="UTF-8">
<beans xmlns=">
第二步是为Aspect切面类添加注解:
package cnyshstudiospringaopaspect;
import orgapachecommonsloggingLog;
import orgapachecommonsloggingLogFactory;
import orgaspectjlangJoinPoint;
import orgaspectjlangProceedingJoinPoint;
import orgaspectjlangannotationAfter;
import orgaspectjlangannotationAfterReturning;
import orgaspectjlangannotationAfterThrowing;
import orgaspectjlangannotationAround;
import orgaspectjlangannotationAspect;
import orgaspectjlangannotationBefore;
import orgaspectjlangannotationPointcut;
import orgspringframeworkstereotypeComponent;
/
系统服务组件Aspect切面Bean
@author Shenghany
@date 2013-5-28
/
//声明这是一个组件
@Component
//声明这是一个切面Bean
@Aspect
public class ServiceAspect {
private final static Log log = LogFactorygetLog(ServiceAspectclass);
//配置切入点,该方法无方法体,主要为方便同类中其他方法使用此处配置的切入点
@Pointcut("execution( cnyshstudiospringaopservice())")
public void aspect(){ }
/
配置前置通知,使用在方法aspect()上注册的切入点
同时接受JoinPoint切入点对象,可以没有该参数
/
@Before("aspect()")
public void before(JoinPoint joinPoint){
if(logisInfoEnabled()){
loginfo("before " + joinPoint);
}
}
//配置后置通知,使用在方法aspect()上注册的切入点
@After("aspect()")
public void after(JoinPoint joinPoint){
if(logisInfoEnabled()){
loginfo("after " + joinPoint);
}
}
//配置环绕通知,使用在方法aspect()上注册的切入点
@Around("aspect()")
public void around(JoinPoint joinPoint){
long start = SystemcurrentTimeMillis();
try {
((ProceedingJoinPoint) joinPoint)proceed();
long end = SystemcurrentTimeMillis();
if(logisInfoEnabled()){
loginfo("around " + joinPoint + "\tUse time : " + (end - start) + " ms!");
}
} catch (Throwable e) {
long end = SystemcurrentTimeMillis();
if(logisInfoEnabled()){
loginfo("around " + joinPoint + "\tUse time : " + (end - start) + " ms with exception : " + egetMessage());
}
}
}
//配置后置返回通知,使用在方法aspect()上注册的切入点
@AfterReturning("aspect()")
public void afterReturn(JoinPoint joinPoint){
if(logisInfoEnabled()){
loginfo("afterReturn " + joinPoint);
}
}
//配置抛出异常后通知,使用在方法aspect()上注册的切入点
@AfterThrowing(pointcut="aspect()", throwing="ex")
public void afterThrow(JoinPoint joinPoint, Exception ex){
if(logisInfoEnabled()){
loginfo("afterThrow " + joinPoint + "\t" + exgetMessage());
}
}
}
测试代码:
package cnyshstudiospringaop;
import orgapachecommonsloggingLog;
import orgapachecommonsloggingLogFactory;
import orgspringframeworkcontextApplicationContext;
import orgspringframeworkcontextsupportClassPathXmlApplicationContext;
import cnyshstudiospringaopserviceUserService;
import cnyshstudiospringmvcbeanUser;
/
Spring AOP测试
@author Shenghany
@date 2013-5-28
/
public class Tester {
private final static Log log = LogFactorygetLog(Testerclass);
public static void main(String[] args) {
//启动Spring容器
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContextxml");
//获取service组件
UserService service = (UserService) contextgetBean("userService");
//以普通的方式调用UserService对象的三个方法
User user = serviceget(1L);
servicesave(user);
try {
servicedelete(1L);
} catch (Exception e) {
if(logisWarnEnabled()){
logwarn("Delete user : " + egetMessage());
}
}
}
}
控制台输出如下:
INFO [springaopaspectServiceAspect:40] before execution(User cnyshstudiospringaopserviceUserServiceget(long))
INFO [springaopserviceUserService:19] getUser method
INFO [springaopaspectServiceAspect:60] around execution(User cnyshstudiospringaopserviceUserServiceget(long)) Use time : 42 ms!
INFO [springaopaspectServiceAspect:48] after execution(User cnyshstudiospringaopserviceUserServiceget(long))
INFO [springaopaspectServiceAspect:74] afterReturn execution(User cnyshstudiospringaopserviceUserServiceget(long))
INFO [springaopaspectServiceAspect:40] before execution(void cnyshstudiospringaopserviceUserServicesave(User))
INFO [springaopserviceUserService:26] saveUser method
INFO [springaopaspectServiceAspect:60] around execution(void cnyshstudiospringaopserviceUserServicesave(User)) Use time : 2 ms!
INFO [springaopaspectServiceAspect:48] after execution(void cnyshstudiospringaopserviceUserServicesave(User))
INFO [springaopaspectServiceAspect:74] afterReturn execution(void cnyshstudiospringaopserviceUserServicesave(User))
INFO [springaopaspectServiceAspect:40] before execution(boolean cnyshstudiospringaopserviceUserServicedelete(long))
INFO [springaopserviceUserService:32] delete method
INFO [springaopaspectServiceAspect:65] around execution(boolean cnyshstudiospringaopserviceUserServicedelete(long)) Use time : 5 ms with exception : spring aop ThrowAdvice演示
INFO [springaopaspectServiceAspect:48] after execution(boolean cnyshstudiospringaopserviceUserServicedelete(long))
INFO [springaopaspectServiceAspect:74] afterReturn execution(boolean cnyshstudiospringaopserviceUserServicedelete(long))
WARN [studiospringaopTester:32] Delete user : Null return value from advice does not match primitive return type for: public boolean cnyshstudiospringaopserviceUserServicedelete(long) throws javalangException
可以看到,正如我们预期的那样,虽然我们并没有对UserSerivce类包括其调用方式做任何改变,但是Spring仍然拦截到了其中方法的调用,或许这正是AOP的魔力所在。
再简单说一下xml配置方式,其实也一样简单:
<xml version="10" encoding="UTF-8">
<beans xmlns=">
个人觉得不如注解灵活和强大,你可以不同意这个观点,但是不知道如下的代码会不会让你的想法有所改善:
//配置前置通知,拦截返回值为cnyshstudiospringmvcbeanUser的方法
@Before("execution(cnyshstudiospringmvcbeanUser cnyshstudiospringaopservice())")
public void beforeReturnUser(JoinPoint joinPoint){
if(logisInfoEnabled()){
loginfo("beforeReturnUser " + joinPoint);
}
}
//配置前置通知,拦截参数为cnyshstudiospringmvcbeanUser的方法
@Before("execution( cnyshstudiospringaopservice(cnyshstudiospringmvcbeanUser))")
public void beforeArgUser(JoinPoint joinPoint){
if(logisInfoEnabled()){
loginfo("beforeArgUser " + joinPoint);
}
}
//配置前置通知,拦截含有long类型参数的方法,并将参数值注入到当前方法的形参id中
@Before("aspect()&&args(id)")
public void beforeArgId(JoinPoint joinPoint, long id){
if(logisInfoEnabled()){
loginfo("beforeArgId " + joinPoint + "\tID:" + id);
}
}
附上UserService的代码(其实很简单):
package cnyshstudiospringaopservice;
import orgapachecommonsloggingLog;
import orgapachecommonsloggingLogFactory;
import cnyshstudiospringmvcbeanUser;
/
用户服务模型
@author Shenghany
@date 2013-5-28
/
public class UserService {
private final static Log log = LogFactorygetLog(UserServiceclass);
public User get(long id){
if(logisInfoEnabled()){
loginfo("getUser method ");
}
return new User();
}
public void save(User user){
if(logisInfoEnabled()){
loginfo("saveUser method ");
}
}
public boolean delete(long id) throws Exception{
if(logisInfoEnabled()){
loginfo("delete method ");
throw new Exception("spring aop ThrowAdvice演示");
}
return false;
}
}
应该说学习Spring AOP有两个难点,第一点在于理解AOP的理念和相关概念,第二点在于灵活掌握和使用切入点表达式。概念的理解通常不在一朝一夕,慢慢浸泡的时间长了,自然就明白了,下面我们简单地介绍一下切入点表达式的配置规则吧。
通常情况下,表达式中使用”execution“就可以满足大部分的要求。表达式格式如下:
execution(modifiers-pattern ret-type-pattern declaring-type-pattern name-pattern(param-pattern) throws-pattern)
modifiers-pattern:方法的 *** 作权限
ret-type-pattern:返回值
declaring-type-pattern:方法所在的包
name-pattern:方法名
parm-pattern:参数名
throws-pattern:异常
其中,除ret-type-pattern和name-pattern之外,其他都是可选的。上例中,execution( comspringservice())表示comspringservice包下,返回值为任意类型;方法名任意;参数不作限制的所有方法。
最后说一下通知参数
可以通过args来绑定参数,这样就可以在通知(Advice)中访问具体参数了。例如,<aop:aspect>配置如下:
<aop:config>
<aop:aspect id="TestAspect" ref="aspectBean">
<aop:pointcut id="businessService"
expression="execution( comspringservice(String,)) and args(msg,)" />
<aop:after pointcut-ref="businessService" method="doAfter"/>
</aop:aspect>
</aop:config>上面的代码args(msg,)是指将切入点方法上的第一个String类型参数添加到参数名为msg的通知的入参上,这样就可以直接使用该参数啦。
以上就是关于mate40pro+后置摄像头参数全部的内容,包括:mate40pro+后置摄像头参数、Jmeter正则表达式获取多个参数实践、Nova8摄像头参数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)