运行时注解主要是通过反射来实现的,而编译时注解则是在编译期间帮助我们生成代码,所以编译时注解效率高,但是实现起来复杂一点,运行时注解效率较低,但是实现起来简单。
首先来看下运行时注解怎么实现的吧。

1.运行时注解

1.1定义注解

首先定义两个运行时注解,其中Retention标明此注解在运行时生效,Target标明此注解的程序元范围,下面两个示例RuntimeBindView用于描述成员变量和类,成员变量绑定view,类绑定layout;RuntimeBindClick用于描述方法,让指定的view绑定click事件。

@Retention(RetentionPolicy.RUNTIME)//运行时生效
@Target({ElementType.FIELD,ElementType.TYPE})//描述变量和类
public @interface RuntimeBindView {int value() default View.NO_ID;
}@Retention(RetentionPolicy.RUNTIME)//运行时生效
@Target(ElementType.METHOD)//描述方法
public @interface RuntimeBindClick {int[] value();
}

1.2反射实现

以下代码是用反射实现的注解功能,其中ClassInfo是一个能解析处类的各种成员和方法的工具类,
源码见https://github.com/huangbei1990/HDemo/blob/master/hutils/src/main/java/com/android/hutils/reflect/ClassInfo.java
其实逻辑很简单,就是从Activity里面取出指定的注解,然后再调用相应的方法,如取出RuntimeBindView描述类的注解,然后得到这个注解的返回值,接着调用activity的setContentView将layout的id设置进去就可以了。

public static void bindId(Activity obj){ClassInfo clsInfo = new ClassInfo(obj.getClass());//处理类if(obj.getClass().isAnnotationPresent(RuntimeBindView.class)) {RuntimeBindView bindView = (RuntimeBindView)clsInfo.getClassAnnotation(RuntimeBindView.class);int id = bindView.value();clsInfo.executeMethod(clsInfo.getMethod("setContentView",int.class),obj,id);}//处理类成员for(Field field : clsInfo.getFields()){if(field.isAnnotationPresent(RuntimeBindView.class)){RuntimeBindView bindView = field.getAnnotation(RuntimeBindView.class);int id = bindView.value();Object view = clsInfo.executeMethod(clsInfo.getMethod("findViewById",int.class),obj,id);clsInfo.setField(field,obj,view);}}//处理点击事件for (Method method : clsInfo.getMethods()) {if (method.isAnnotationPresent(RuntimeBindClick.class)) {int[] values = method.getAnnotation(RuntimeBindClick.class).value();for (int id : values) {View view = (View) clsInfo.executeMethod(clsInfo.getMethod("findViewById", int.class), obj, id);view.setOnClickListener(v -> {try {method.invoke(obj, v);} catch (Exception e) {e.printStackTrace();}});}}}
}

1.3使用

如下所示,将我们定义好的注解写到相应的位置,然后调用BindApi的bind函数,就可以了。很简单吧

@RuntimeBindView(R.layout.first)//类
public class MainActivity extends AppCompatActivity {@RuntimeBindView(R.id.jump)//成员public Button jump;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);BindApi.bindId(this);//调用反射}@RuntimeBindClick({R.id.jump,R.id.jump2})//方法public void onClick(View view){Intent intent = new Intent(this,SecondActivity.class);startActivity(intent);}
}

2.编译时注解

编译时注解就是在编译期间帮你自动生成代码,其实原理也不难。

2.1定义注解

我们可以看到,编译时注解定义的时候Retention的值和运行时注解不同。

@Retention(RetentionPolicy.CLASS)//编译时生效
@Target({ElementType.FIELD,ElementType.TYPE})//描述变量和类
public @interface CompilerBindView {int value() default -1;
}@Retention(RetentionPolicy.CLASS)//编译时生效
@Target(ElementType.METHOD)//描述方法
public @interface CompilerBindClick {int[] value();
}

2.2根据注解生成代码

1)准备工作

首先我们要新建一个java的lib库,因为接下需要继承AbstractProcessor类,这个类Android里面没有。
在这里插入图片描述
然后我们需要引入两个包,javapoet是帮助我们生成代码的包,auto-service是帮助我们自动生成META-INF等信息,这样我们编译的时候就可以执行我们自定义的processor了。

apply plugin: 'java-library'dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])api 'com.squareup:javapoet:1.9.0'api 'com.google.auto.service:auto-service:1.0-rc2'
}sourceCompatibility = "1.8"
targetCompatibility = "1.8"

2)继承AbstractProcessor

如下所示,我们需要自定义一个类继承子AbstractProcessor并复写他的方法,并加上AutoService的注解。
ClassElementsInfo是用来存储类信息的类,这一步先暂时不用管,下一步会详细说明。
其实从函数的名称就可以看出是什么意思,init初始化,getSupportedSourceVersion限定所支持的jdk版本,getSupportedAnnotationTypes需要处理的注解,process我们可以在这个函数里面拿到拥有我们需要处理注解的类,并生成相应的代码。

@AutoService(Processor.class)
public class CompilerBindProcessor extends AbstractProcessor{private Filer mFileUtils;//文件相关的辅助类,负责生成java代码private Elements mElementUtils;//元素相关的辅助类,获取元素相关的信息private Map<String,ClassElementsInfo> classElementsInfoMap;@Overridepublic synchronized void init(ProcessingEnvironment processingEnvironment) {super.init(processingEnvironment);mFileUtils = processingEnvironment.getFiler();mElementUtils = processingEnvironment.getElementUtils();classElementsInfoMap = new HashMap<>();}@Overridepublic SourceVersion getSupportedSourceVersion() {return SourceVersion.latestSupported();}@Overridepublic Set<String> getSupportedAnnotationTypes() {Set<String> set = new LinkedHashSet<>();set.add(CompilerBindClick.class.getCanonicalName());set.add(CompilerBindView.class.getCanonicalName());return set;}@Overridepublic boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {classElementsInfoMap.clear();//1.搜集所需要的信息collection(roundEnvironment);//2.生成具体的代码generateClass();return true;}

3)搜集注解

首先我们看下ClassElementsInfo这个类,也就是我们需要搜集的信息。
TypeElement为类元素,VariableElement为成员元素,ExecutableElement为方法元素,从中我们可以获取到各种注解信息。
classSuffix为前缀,例如原始类为MainActivity,注解生成的类名就为MainActivity+classSuffix

public class ClassElementsInfo {//类public TypeElement mTypeElement;public int value;public String packageName;//成员,key为idpublic Map<Integer,VariableElement> mVariableElements = new HashMap<>();//方法,key为idpublic Map<Integer,ExecutableElement> mExecutableElements = new HashMap<>();//后缀public static final String classSuffix = "proxy";public String getProxyClassFullName() {return mTypeElement.getQualifiedName().toString() + classSuffix;}public String getClassName() {return mTypeElement.getSimpleName().toString() + classSuffix;}......
}

然后我们就可以开始搜集注解信息了,
如下所示,按照注解类型一个一个的搜集,可以通过roundEnvironment.getElementsAnnotatedWith函数拿到注解元素,拿到之后再根据注解元素的类型分别填充到ClassElementsInfo当中。
其中ClassElementsInfo是存储在Map当中,key是String是classPath。

private void collection(RoundEnvironment roundEnvironment){//1.搜集compileBindView注解Set<? extends Element> set = roundEnvironment.getElementsAnnotatedWith(CompilerBindView.class);for(Element element : set){//1.1搜集类的注解if(element.getKind() == ElementKind.CLASS){TypeElement typeElement = (TypeElement)element;String classPath = typeElement.getQualifiedName().toString();String className = typeElement.getSimpleName().toString();String packageName = mElementUtils.getPackageOf(typeElement).getQualifiedName().toString();CompilerBindView bindView = element.getAnnotation(CompilerBindView.class);if(bindView != null){ClassElementsInfo info = classElementsInfoMap.get(classPath);if(info == null){info = new ClassElementsInfo();classElementsInfoMap.put(classPath,info);}info.packageName = packageName;info.value = bindView.value();info.mTypeElement = typeElement;}}//1.2搜集成员的注解else if(element.getKind() == ElementKind.FIELD){VariableElement variableElement = (VariableElement) element;String classPath = ((TypeElement)element.getEnclosingElement()).getQualifiedName().toString();CompilerBindView bindView = variableElement.getAnnotation(CompilerBindView.class);if(bindView != null){ClassElementsInfo info = classElementsInfoMap.get(classPath);if(info == null){info = new ClassElementsInfo();classElementsInfoMap.put(classPath,info);}info.mVariableElements.put(bindView.value(),variableElement);}}}//2.搜集compileBindClick注解Set<? extends Element> set1 = roundEnvironment.getElementsAnnotatedWith(CompilerBindClick.class);for(Element element : set1){if(element.getKind() == ElementKind.METHOD){ExecutableElement executableElement = (ExecutableElement) element;String classPath = ((TypeElement)element.getEnclosingElement()).getQualifiedName().toString();CompilerBindClick bindClick = executableElement.getAnnotation(CompilerBindClick.class);if(bindClick != null){ClassElementsInfo info = classElementsInfoMap.get(classPath);if(info == null){info = new ClassElementsInfo();classElementsInfoMap.put(classPath,info);}int[] values = bindClick.value();for(int value : values) {info.mExecutableElements.put(value,executableElement);}}}}
}

4)生成代码

如下所示使用javapoet生成代码,使用起来并不复杂。

public class ClassElementsInfo {......public String generateJavaCode() {ClassName viewClass = ClassName.get("android.view","View");ClassName clickClass = ClassName.get("android.view","View.OnClickListener");ClassName keepClass = ClassName.get("android.support.annotation","Keep");ClassName typeClass = ClassName.get(mTypeElement.getQualifiedName().toString().replace("."+mTypeElement.getSimpleName().toString(),""),mTypeElement.getSimpleName().toString());//构造方法MethodSpec.Builder builder = MethodSpec.constructorBuilder().addModifiers(Modifier.PUBLIC).addParameter(typeClass,"host",Modifier.FINAL);if(value > 0){builder.addStatement("host.setContentView($L)",value);}//成员Iterator<Map.Entry<Integer,VariableElement>> iterator = mVariableElements.entrySet().iterator();while(iterator.hasNext()){Map.Entry<Integer,VariableElement> entry = iterator.next();Integer key = entry.getKey();VariableElement value = entry.getValue();String name = value.getSimpleName().toString();String type = value.asType().toString();builder.addStatement("host.$L=($L)host.findViewById($L)",name,type,key);}//方法Iterator<Map.Entry<Integer,ExecutableElement>> iterator1 = mExecutableElements.entrySet().iterator();while(iterator1.hasNext()){Map.Entry<Integer,ExecutableElement> entry = iterator1.next();Integer key = entry.getKey();ExecutableElement value = entry.getValue();String name = value.getSimpleName().toString();MethodSpec onClick = MethodSpec.methodBuilder("onClick").addAnnotation(Override.class).addModifiers(Modifier.PUBLIC).addParameter(viewClass,"view").addStatement("host.$L(host.findViewById($L))",value.getSimpleName().toString(),key).returns(void.class).build();//构造匿名内部类TypeSpec clickListener = TypeSpec.anonymousClassBuilder("").addSuperinterface(clickClass).addMethod(onClick).build();builder.addStatement("host.findViewById($L).setOnClickListener($L)",key,clickListener);}TypeSpec typeSpec = TypeSpec.classBuilder(getClassName()).addModifiers(Modifier.PUBLIC).addAnnotation(keepClass).addMethod(builder.build()).build();JavaFile javaFile = JavaFile.builder(packageName,typeSpec).build();return javaFile.toString();}
}

最终使用了注解之后生成的代码如下

package com.android.hdemo;import android.support.annotation.Keep;
import android.view.View;
import android.view.View.OnClickListener;
import java.lang.Override;@Keep
public class MainActivityproxy {public MainActivityproxy(final MainActivity host) {host.setContentView(2131296284);host.jump=(android.widget.Button)host.findViewById(2131165257);host.findViewById(2131165258).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {host.onClick(host.findViewById(2131165258));}});host.findViewById(2131165257).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {host.onClick(host.findViewById(2131165257));}});}
}

5)让注解生效

我们生成了代码之后,还需要让原始的类去调用我们生成的代码

public class BindHelper {static final Map<Class<?>,Constructor<?>> Bindings = new HashMap<>();public static void inject(Activity activity){String classFullName = activity.getClass().getName() + ClassElementsInfo.classSuffix;try{Constructor constructor = Bindings.get(activity.getClass());if(constructor == null){Class proxy = Class.forName(classFullName);constructor = proxy.getDeclaredConstructor(activity.getClass());Bindings.put(activity.getClass(),constructor);}constructor.setAccessible(true);constructor.newInstance(activity);}catch (Exception e){e.printStackTrace();}}
}

2.3调试

首先在gradle.properties里面加入如下的代码

android.enableSeparateAnnotationProcessing = true
org.gradle.daemon=true
org.gradle.jvmargs=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8888

然后点击Edit Configurations
在这里插入图片描述
新建一个remote
在这里插入图片描述
然后填写相关的参数,127.0.0.1表示本机,port与刚才gradle.properties里面填写的保持一致,然后点击ok
在这里插入图片描述
然后将Select Run/Debug Configuration选项调整到刚才新建的Configuration上,然后点击Build–Rebuild Project,就可以开始调试了。
在这里插入图片描述

2.4使用

如下所示为原始的类

@CompilerBindView(R.layout.first)
public class MainActivity extends AppCompatActivity {@CompilerBindView(R.id.jump)public Button jump;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);BindHelper.inject(this);}@CompilerBindClick({R.id.jump,R.id.jump2})public void onClick(View view){Intent intent = new Intent(this,SecondActivity.class);startActivity(intent);}
}

以下为生成的类

package com.android.hdemo;import android.support.annotation.Keep;
import android.view.View;
import android.view.View.OnClickListener;
import java.lang.Override;@Keep
public class MainActivityproxy {public MainActivityproxy(final MainActivity host) {host.setContentView(2131296284);host.jump=(android.widget.Button)host.findViewById(2131165257);host.findViewById(2131165258).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {host.onClick(host.findViewById(2131165258));}});host.findViewById(2131165257).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {host.onClick(host.findViewById(2131165257));}});}
}

3.总结

注解框架看起来很高大上,其实弄懂之后也不难,都是一个套路。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. VScode搭建Python虚拟环境,并且使用两种方法进行(code runner插件VSPython插件)编译

    之前用的是PyCharm,但是这段时间注册码过期了,又找不到新的注册码,干脆暂时弃坑,转而投入VScode的大家庭。下载安装VScode,python以及在VScode中安装python的插件,codeRunner插件这里就不赘述了,百度一下都有。关于虚拟环境这块,有兴趣可以翻一下我之前的博客,里面有简…...

    2024/4/27 22:57:17
  2. 队列Queue(Java)

    队列Queue 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列是一种线性结构 相比数组,队列相应的操作…...

    2024/4/27 21:25:21
  3. 03 猜数字

    题目 Given a valid (IPv4) IP address, return a defanged version of that IP address. A defanged IP address replaces every period “.” with “[.]”. Example 1: Input: address = “1.1.1.1” Output: “1[.]1[.]1[.]1” Example 2: Input: address = “255.100.50.0…...

    2024/4/28 2:23:49
  4. jiayu -turtle画画的各种功能

    import turtle # 颜色 color turtle.color(blue) # 宽度 width 笔的尺寸 pensize turtle.width(8) # 形状 shape turtle.shape(turtle) # 填充颜色 fillcolor turtle.fillcolor(yellow) # 告诉电脑开始填充 begin_fill turtle.begin_fill() turtle.fd(100) turtle.lt(144) t…...

    2024/4/28 15:23:38
  5. Python学习笔记-Python 变量类型

    变量是存储在内存中的值。这就意味着在创建变量时会在内存中开辟一个空间。变量赋值Python 中的变量赋值不需要类型声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。等号(=)用来给变量赋值。等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变…...

    2024/4/28 15:47:31
  6. 机器学习与深度学习的区别

    部分内容来自网络(唐宇迪老师) 机器学习:深度学习: 深度学习(DeepLearning,DL)属于机器学习的子类。它的灵感来源于人类大脑的工作方式,是利用深度神经网络来解决特征表达的一种学习过程。深度神经网络本身并非是一个全新的概念,可理解为包含多个隐含层的神经网络结构。…...

    2024/4/28 2:14:41
  7. NotePad++ 正则表达式复制指定字符串

    NotePad++ 正则表达式复制指定字符串本文仅描述一种复制文本的方法,如需拓展功能请自行百度。本人对正则表达式规则也不是很清晰,稳重若有错误请评论指出,但勿暴躁!。在使用Verilog时,顶层模块例化代码时,使用一种比较简洁的方法来例化程序,于是决定使用Notepad++文本工…...

    2024/4/28 0:26:08
  8. python import os

    import os os.getcwd() # 当前目录 os.chdir(D://) # 改变目录 os.listdir() # 列出当前目录的所有文件 os.mkdir(D://A) # 创建目录 os.remove(D://A//123.txt) # 删除文件 os.rmdir(D://A) # 删除目录 os.makedirs(D://A//AA//AAA) # 创建多级目录 os.removedirs(D//A) # 删除…...

    2024/4/25 16:21:25
  9. anaconda tensorflow自动安装,避免走弯路浪费时间

    网上看得大部分安装tensorflow的博客都是使用pip命令安装tensorflow,这样安装的tensorflow-gpu还必须自己手动下载对应版本的python,CUDA及CUDnn,非常麻烦,且很容易出问题,我花了两天时间才全部配好,但还是出了各种问题(在教研室的电脑上,最终放弃这台电脑,在自己的笔…...

    2024/4/28 0:38:45
  10. 成为技术领导者

    MOI激励 组织 创新/头脑:种子,图景。第十人理论逆向思考,自我反驳 永远要有最坏的打算,同时尽最大努力。5分钟日记技术领导力的第一步 事实/感受/教训...

    2024/4/28 6:24:28
  11. 好名字——能看出方法特征的名字才是好名字

    无名天地之始,有名万物之母——《道德经》 名字是一切的开始,名字是一个东西的缩影。在程序里面,命名也总是一个难题。数据来源:https://ubuntuforums.org/showthread.php?t=690304我统计了一下项目代码中方法都是用什么开头的,统计时仅包含Java代码,不包括测试代码这里…...

    2024/4/28 17:11:15
  12. 提示红线的位置不一定是错误的地方:expression must be a modifiable lvalue错误的地方可可能存在与这条语句的另外一个位置

    C语言错误:expression must be a modifiable lvalue 左边的变量是不可修改的变量。。。 实际上不是n错 而是 是c==...

    2024/4/28 7:43:45
  13. 洛谷P1000超级玛丽

    题目背景本题是洛谷的试机题目,可以帮助了解洛谷的使用。 建议完成本题目后继续尝试P1001、P1008。题目描述超级玛丽是一个非常经典的游戏。请你用字符画的形式输出超级玛丽中的一个场景。 ******** ************ ####…#. #…###…##… ###…###### ### …...

    2024/4/4 22:57:15
  14. 常见基本数据结构——散列

    散列表的实现通常叫做散列。散列是一种用于以常数平均时间执行插入、删除和查找的技术。但是任何排序的信息都不会得到有效的支持。所以FindMax(),FindMin(),以及以线性时间打印的操作都是散列所不支持的。理想的散列表数据结构值不过是一个包含有关键字的具有固定大小的数组…...

    2024/4/7 22:09:40
  15. Counter使用

    #conding=utf-8 from collections import Counter import pandas as pd ws=pd.read_excel(F:\\项目\\2019.12.24\\20191224数据汇总\\20191224数据汇总\\2017\\分表数据\\四条数据.xlsx) wp=ws.titlefor i,j in Counter(wp).items():if j!=4:continueelse:print(i)...

    2024/4/8 6:07:45
  16. uncurl 接口数据变python代码

    简介:uncurl是一个库,允许您将curl请求转换为使用requests 的python代码。由于Chrome网络检查器具有的“copy as cURL”,因此该工具对于用python重新创建浏览器请求很有用。安装:(venv) zhangdeMacBook-Pro:pythonClass test$ pip install uncurl使用步骤:(Google Chrome浏…...

    2024/4/8 9:40:33
  17. 设计模式之原型模式

    我们在创建对象时,通常是通过new关键字来创建的。但是,思考一下,如果当前类的构造函数很复杂,每次new对象时都会消耗非常多的资源,这样肯定是不行的,耗时又费力。 那有没有什么办法解决这种问题呢?当然有,原型模式就可以解决这个痛点。 原型模式非常好理解,就是类的实…...

    2024/4/8 14:07:59
  18. File类

    File f1 = new File("./java"); 创建File对象,可以使用以下列表中的方法操作文件。序号方法描述1public String getName()返回由此抽象路径名表示的文件或目录的名称。2public String getParent()返回此抽象路径名的父路径名的路径名字符串,如果此路径名没有指定父…...

    2024/4/11 10:00:29
  19. SpringCloudAlibaba 二、springboot 配置使用 nacos 作为注册中心,通过RestTemplate ,rpc工具调用测试

    使用前提 搭建nacos环境: https://blog.csdn.net/qq_41463655/article/details/104002968 RPC 工具RestTemplate :https://blog.csdn.net/qq_41463655/article/details/103431953 本文模拟环境如下图:一、创建springboot 项目 alibaba-server( 版本2.0.1) 生产者项目模拟 …...

    2024/4/11 15:03:02
  20. Linux下检测IP地址冲突及解决方法

    问题说明: 在公司办公网内的一台物理机A上安装了linux系统(ip:192.168.9.120),在上面部署了jenkins,redmine,svn程序。由于是在办公网内,这台机器和同事电脑都是在同一网段的。 突然某天问题出来了:有部分同事远程ssh登陆不上这台linux系统的机器,jenkins/redmine/svn…...

    2024/4/11 18:25:11

最新文章

  1. kotlin 编写一个简单的天气预报app (七)使用material design

    一、优化思路 对之前的天气预报的app进行了优化&#xff0c;原先的天气预报程序逻辑是这样的。 使用text和button组合了一个输入城市&#xff0c;并请求openweathermap对应数据&#xff0c;并显示的功能。 但是搜索城市的时候&#xff0c;可能会有错误&#xff0c;比如大小写…...

    2024/4/28 18:17:24
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. JSON格式转换

    文章目录 1. JSON 格式2. 细节 1. JSON 格式 实体类格式&#xff1a; public class Student {public string name {get; set;}public int age {get; set;} } public class Classs {public string teacher {get; set;}public List<Student> students {get; set;} }JSON格…...

    2024/4/18 22:12:03
  4. Ubuntu磁盘扩容

    使用 df -h命令查看系统磁盘控件的使用情况&#xff1a; [samspobosrv:~]$ df -h Filesystem Size Used Avail Use% Mounted on udev 7.8G 0 7.8G 0% /dev tmpfs 1.6G 1.7M 1.…...

    2024/4/25 7:31:32
  5. 软考中级(网络工程师考核要点)第一章 计算机网络系统(信道特性应用)第七期(多路复用技术、差错控制)

    1. 分析&#xff1a;每个样本量为256个等级&#xff0c;用二进制表示每个样本量&#xff0c;256&#xff0c;也就是有8个信道&#xff0c;本题并不需要考虑到信道宽&#xff0c;就不需要用信道宽&#xff0c;将125微秒换算成0.000125秒&#xff0c;然后将8个信道除采样周期0.00…...

    2024/4/27 11:00:23
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/28 13:52:11
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/28 3:28:32
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/28 13:51:37
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/28 15:57:13
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/28 1:22:35
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57