钱明伙 2025-11-02 02:17:27
每经编辑|阿拉-普加乔娃
当地时间2025-11-02,mjwysadhwejkrbdsfjhbsdvf,哔哩哔哩palipali轻量版
JavaParser:代码世界的(de)“解语花(hua)”,让(rang)你的开(kai)发效率“芝麻开花节(jie)节高(gao)”
在这(zhe)个(ge)瞬(shun)息万变的(de)软件开发领域(yu),效(xiao)率就是(shi)生(sheng)命(ming)线。而(er)当(dang)涉(she)及到处理复(fu)杂的Java代(dai)码时(shi),你(ni)是(shi)否(fou)曾(ceng)经有过这(zhe)样(yang)的(de)困扰(rao):庞(pang)大(da)的代(dai)码库(ku)让你(ni)望(wang)而(er)却步(bu),繁琐(suo)的重(zhong)复性操(cao)作(zuo)让你(ni)筋疲(pi)力(li)尽(jin),代码(ma)的质(zhi)量(liang)审(shen)计(ji)更(geng)是像(xiang)一场(chang)“大(da)海(hai)捞针(zhen)”的冒险(xian)?别(bie)担心,今天(tian),我就(jiu)要(yao)为(wei)你揭开一(yi)个代码(ma)处理的“神器”——JavaParser的神秘面(mian)纱,并(bing)为你(ni)带来(lai)一份(fen)专属(shu)于“人(ren)妻”的、既(ji)实用又(you)充满智(zhi)慧(hui)的编(bian)程指南。
“人(ren)妻”这(zhe)个词,或许(xu)会让(rang)你联(lian)想到(dao)温柔(rou)、顾(gu)家、细心(xin),当(dang)然(ran),也(ye)可(ke)能意味着生(sheng)活(huo)经验丰富(fu),懂得(de)如(ru)何在琐(suo)碎中找到效率(lv)之道(dao)。没(mei)错,这份(fen)指南就(jiu)是(shi)要将(jiang)JavaParser的强(qiang)大功能,以(yi)最贴(tie)近生活、最(zui)实(shi)用的方式呈(cheng)现给你,让(rang)你在(zai)繁忙的工(gong)作和(he)生活(huo)中,也能轻(qing)松驾(jia)驭代码,将(jiang)开(kai)发(fa)效(xiao)率(lv)提升(sheng)到新(xin)的高度。
什(shen)么是JavaParser?——代码的“百科全书”与(yu)“翻(fan)译(yi)官”
想象一(yi)下,我们拿(na)到一(yi)段Java代(dai)码,它(ta)就像(xiang)一封(feng)写满(man)了(le)加密信(xin)息的(de)信件。我们能看(kan)到文字,但(dan)要理(li)解其深层(ceng)含义(yi),洞察其(qi)结(jie)构和(he)逻(luo)辑,就需(xu)要一(yi)个(ge)强(qiang)大的(de)“翻(fan)译(yi)官”和(he)“百科全书(shu)”。JavaParser正是扮演(yan)着这(zhe)样(yang)的(de)角色(se)。
它是(shi)一个(ge)强(qiang)大(da)的Java解(jie)析(xi)器,能够(gou)将Java源代(dai)码(ma)解析(xi)成抽象语法树(shu)(AbstractSyntaxTree,AST)。AST是什么(me)?简单来(lai)说,它就是(shi)代码(ma)结构(gou)的(de)一种层(ceng)级化(hua)、图(tu)形(xing)化的(de)表示。你可(ke)以把(ba)它想(xiang)象成(cheng)一(yi)棵精心修剪(jian)过的(de)盆景(jing),每(mei)一(yi)片叶子、每一根(gen)枝干(gan)都(dou)代表着代码中的(de)某个元素,如类(lei)、方(fang)法(fa)、变量(liang)、表(biao)达式等(deng)。
通(tong)过(guo)AST,我们(men)可以(yi)清晰(xi)地看到代(dai)码的(de)骨架,理解(jie)各(ge)个(ge)部分之间的关(guan)系。
更重要(yao)的(de)是(shi),JavaParser不(bu)仅仅(jin)是(shi)一个(ge)“阅读器(qi)”,它还是(shi)一个“写作者”。在解析(xi)代码(ma)的基(ji)础上,它(ta)还能对(dui)AST进行修改(gai),甚至(zhi)从零开(kai)始构建(jian)AST,然后将(jiang)其(qi)“翻译”回(hui)可(ke)执行(xing)的Java源(yuan)代码。这(zhe)意味(wei)着(zhe),我们可(ke)以通过(guo)编程的方(fang)式,来“操控”和“创造”Java代(dai)码,这其中的潜力,简直(zhi)是(shi)无(wu)限(xian)的!
为什么(me)JavaParser对“人(ren)妻(qi)”开(kai)发者(zhe)如此(ci)重要(yao)?——解锁高(gao)效生活(huo)的(de)“秘(mi)密武(wu)器”
你可(ke)能(neng)会问,我一(yi)个“人妻”开(kai)发(fa)者(zhe),为(wei)什(shen)么(me)要(yao)花时间去(qu)研究(jiu)JavaParser?答案(an)很简(jian)单:效(xiao)率!
告(gao)别(bie)低效(xiao)重(zhong)复(fu),拥(yong)抱(bao)智(zhi)能自(zi)动化:想象(xiang)一(yi)下(xia),你需要批量修(xiu)改大量的(de)代码(ma),比如统一命名规则、添(tian)加日志(zhi)打(da)印(yin)、或者检查代码(ma)规(gui)范(fan)。手动(dong)一(yi)行一(yi)行(xing)修改(gai),不仅(jin)耗(hao)时耗(hao)力(li),还极(ji)易(yi)出(chu)错。而(er)有了JavaParser,你可以编(bian)写脚本,让它自(zi)动帮(bang)你完成这(zhe)些任务。这(zhe)就像(xiang)你(ni)不再(zai)需(xu)要亲(qin)手一(yi)件件(jian)熨烫(tang)所有(you)衣物(wu),而(er)是(shi)拥有了一台智(zhi)能烘(hong)干熨烫机(ji),大(da)大解放(fang)了你(ni)的双手和(he)时间(jian)。
代(dai)码审(shen)查的“火(huo)眼金(jin)睛”:在(zai)团队协作中(zhong),代码审查是保(bao)证代码(ma)质量的关键。但面(mian)对(dui)海量代(dai)码(ma),人工审查(cha)难免(mian)有疏(shu)漏(lou)。JavaParser可以帮助你(ni)构建(jian)自动(dong)化代码审(shen)查工(gong)具,自动(dong)检查代(dai)码是(shi)否(fou)符(fu)合预(yu)设的规(gui)范(fan),发现潜在(zai)的bug,甚至预(yu)测代码的(de)复杂(za)度。这(zhe)就像(xiang)给你(ni)的代(dai)码请(qing)了一(yi)位“最(zui)挑剔(ti)的侦(zhen)探”,事(shi)无巨(ju)细,不放过任(ren)何疑点(dian)。
学习新技术(shu)的(de)“加速器”:当你需(xu)要(yao)学习新的Java框架或(huo)库(ku)时(shi),理解其(qi)源代码是最(zui)好的方式。JavaParser可以(yi)帮(bang)助你(ni)快速地(di)解析(xi)和理解这些复(fu)杂(za)的代(dai)码结构,将(jiang)陌生的(de)代码变成你熟悉的数(shu)据模型(xing),从而(er)加速你(ni)的学习(xi)进(jin)程。这就像你拿到一本新食谱(pu),JavaParser帮你把(ba)复杂(za)的(de)菜(cai)谱步(bu)骤分(fen)解成(cheng)清晰(xi)的原料列表和(he)烹饪顺(shun)序,让(rang)你(ni)轻松上手(shou)。
代(dai)码(ma)生(sheng)成与重构的(de)“魔法(fa)棒”:需(xu)要根据(ju)某些规(gui)则自(zi)动(dong)生成大量的(de)Java代(dai)码?需(xu)要对(dui)现有代码进(jin)行大(da)规模(mo)的重构(gou)?JavaParser都(dou)能帮(bang)你(ni)轻(qing)松(song)实(shi)现。它(ta)可以(yi)根据(ju)模板或(huo)数(shu)据生成代码,也可(ke)以(yi)帮你对(dui)代码进(jin)行(xing)结构性(xing)调整(zheng),让(rang)你的代(dai)码更(geng)加优(you)雅、高(gao)效(xiao)。这(zhe)就像你拥(yong)有了一根“魔法棒(bang)”,只(zhi)需轻(qing)轻(qing)一点,就(jiu)能变(bian)出整齐(qi)划(hua)一的代(dai)码,或者(zhe)将混(hun)乱的(de)代码(ma)变(bian)得井井有(you)条。
要(yao)使(shi)用JavaParser,首先需(xu)要将(jiang)其添(tian)加到你的项目(mu)中。如(ru)果你使用Maven,只需在pom.xml中添(tian)加(jia)如下(xia)依(yi)赖:
com.github.javaparserjavaparser-core3.17.0
添加(jia)完依赖后,我们(men)就可(ke)以开(kai)始(shi)我(wo)们的(de)第一(yi)次“代码(ma)对(dui)话”了(le)。最简(jian)单的(de)用法(fa)就(jiu)是解析(xi)一(yi)段字符(fu)串形式的(de)Java代(dai)码:
importcom.github.javaparser.StaticJavaParser;importcom.github.javaparser.ast.CompilationUnit;publicclassSimpleParse{publicstaticvoidmain(String[]args){Stringcode="publicclassHelloWorld{publicstaticvoidmain(String[]args){System.out.println(\"Hello,World!\");}}";CompilationUnitcu=StaticJavaParser.parse(code);System.out.println(cu.toString());//输出(chu)解析(xi)后(hou)的代(dai)码(通(tong)常(chang)会(hui)格式(shi)化(hua))}}
运行(xing)这段代码,你会看(kan)到,JavaParser已经将你(ni)输(shu)入的字(zi)符(fu)串(chuan)代(dai)码,解析成了一(yi)个(ge)CompilationUnit对象,并且(qie)toString()方(fang)法还会以(yi)更规范(fan)的格式输出它。这就(jiu)是我(wo)们(men)与(yu)JavaParser的初(chu)次(ci)“握手(shou)”,一个完(wan)整的Java文件,已经(jing)被它(ta)“读懂”,并转(zhuan)化为一(yi)个(ge)结构化的数(shu)据(ju)对象(xiang)。
接下来的(de)内容(rong),我们将深(shen)入(ru)到(dao)AST的细节,学(xue)习如何提(ti)取(qu)信息、进(jin)行修(xiu)改(gai),并(bing)结合(he)实战案例(li),展示(shi)JavaParser如何在实际(ji)开发中(zhong)大显身手(shou),帮(bang)助你(ni)真正(zheng)实(shi)现开(kai)发(fa)效率的飞跃。准备好了(le)吗(ma)?让(rang)我们(men)一起(qi)在(zai)代码的世(shi)界里(li),开启(qi)一(yi)段高(gao)效(xiao)而(er)充(chong)满乐(le)趣(qu)的旅(lv)程!
JavaParser实(shi)战:从(cong)“零件(jian)”到“建筑”,构建你的(de)自动(dong)化(hua)代码(ma)帝国
在Part1中(zhong),我们(men)已经初(chu)步(bu)认识了JavaParser这(zhe)个强(qiang)大的(de)代码(ma)处理(li)工具,并(bing)了(le)解了(le)它为(wei)何能成(cheng)为我们(men)提(ti)升(sheng)开发(fa)效率的“秘密武(wu)器”。现在(zai),是时候(hou)深入实践,看看(kan)如何将JavaParser的潜力(li)转化(hua)为实际的(de)生产(chan)力了(le)。我们(men)将从(cong)解(jie)析(xi)代(dai)码(ma)的“零件”(AST节(jie)点(dian))入(ru)手,学(xue)习(xi)如(ru)何像搭(da)积木一样(yang)“建造”属(shu)于我(wo)们(men)的(de)自动(dong)化(hua)代码解(jie)决方(fang)案。
JavaParser的核(he)心在于(yu)它能够(gou)将(jiang)Java代(dai)码(ma)转化(hua)为(wei)AST。AST并非(fei)单一的结(jie)构,而是(shi)一(yi)个由(you)各(ge)种节(jie)点组成(cheng)的复(fu)杂(za)网(wang)络(luo)。每(mei)个节点(dian)都(dou)代(dai)表(biao)着代码中的(de)一(yi)个特定元素,例(li)如(ru):
CompilationUnit:代表一个完(wan)整的Java源(yuan)文件(jian)。PackageDeclaration:代(dai)表包(bao)声(sheng)明(ming)。ImportDeclaration:代表(biao)导入语句(ju)。TypeDeclaration:代表类、接口、枚(mei)举、注(zhu)解等类型(xing)声(sheng)明(ming)。
ClassOrInterfaceDeclaration:代(dai)表(biao)类或接口(kou)声(sheng)明(ming)。MethodDeclaration:代表(biao)方(fang)法(fa)声明(ming)。VariableDeclarationExpr:代表(biao)变量(liang)声(sheng)明。MethodCallExpr:代表方法(fa)调用(yong)。
LiteralExpr:代表字面(mian)量(liang)(如数字、字符(fu)串)。
理解这些节(jie)点及其(qi)关(guan)系,就(jiu)像掌(zhang)握(wo)了代(dai)码(ma)的“基因(yin)密(mi)码”。通过(guo)遍(bian)历(li)AST,我们可(ke)以轻松提取所(suo)需信(xin)息(xi)。例如,要(yao)获取一个类中的所(suo)有(you)方(fang)法名(ming),我们可以这样(yang)操作:
importcom.github.javaparser.StaticJavaParser;importcom.github.javaparser.ast.CompilationUnit;importcom.github.javaparser.ast.body.MethodDeclaration;importcom.github.javaparser.ast.visitor.VoidVisitorAdapter;importjava.io.File;importjava.io.FileNotFoundException;importjava.util.ArrayList;importjava.util.List;publicclassMethodExtractor{publicstaticvoidmain(String[]args)throwsFileNotFoundException{StringfilePath="path/to/your/JavaFile.java";//替(ti)换(huan)为你(ni)的Java文件路径CompilationUnitcu=StaticJavaParser.parse(newFile(filePath));ListmethodNames=newArrayList<>();newMethodVisitor().visit(cu,methodNames);System.out.println("Methodsfound:");for(StringmethodName:methodNames){System.out.println("-"+methodName);}}privatestaticclassMethodVisitorextendsVoidVisitorAdapter>{@Overridepublicvoidvisit(MethodDeclarationn,Listarg){super.visit(n,arg);arg.add(n.getNameAsString());//获(huo)取方(fang)法(fa)名(ming)并添(tian)加到列(lie)表中}}}
在(zai)这段代码中,我(wo)们使用(yong)了(le)VoidVisitorAdapter,这是(shi)一种访问者模(mo)式(shi)的(de)实(shi)现,能(neng)够方便(bian)地遍历AST的每一(yi)个节(jie)点。当访问到MethodDeclaration节(jie)点(dian)时(shi),我们就提(ti)取(qu)它(ta)的名字(zi),并将其(qi)添加(jia)到(dao)列(lie)表(biao)中(zhong)。这(zhe)只(zhi)是冰山一(yi)角,你可以(yi)想象,基(ji)于这(zhe)种能(neng)力(li),我(wo)们(men)可(ke)以(yi)实现(xian)多少(shao)自(zi)动化的(de)代(dai)码分析任务(wu)!
实战(zhan)案(an)例:让(rang)JavaParser成为你(ni)的“开发副手”
理论(lun)讲得(de)再(zai)多,不(bu)如(ru)实战来得(de)实在。让(rang)我们(men)来看看几(ji)个能(neng)切实提升(sheng)开发(fa)效率的(de)JavaParser实(shi)战案例。
假(jia)设你需要给所有的service层方(fang)法添加统一(yi)的日(ri)志(zhi)打印(yin),比如(ru)记录(lu)方(fang)法(fa)开始(shi)和结(jie)束,以及(ji)参数(shu)信息(xi)。手动(dong)添加显(xian)然是(shi)低效(xiao)且容(rong)易(yi)遗(yi)漏的。
importcom.github.javaparser.StaticJavaParser;importcom.github.javaparser.ast.CompilationUnit;importcom.github.javaparser.ast.body.MethodDeclaration;importcom.github.javaparser.ast.expr.Expression;importcom.github.javaparser.ast.expr.MethodCallExpr;importcom.github.javaparser.ast.expr.NameExpr;importcom.github.javaparser.ast.expr.StringLiteralExpr;importcom.github.javaparser.ast.stmt.BlockStmt;importcom.github.javaparser.ast.stmt.ExpressionStmt;importcom.github.javaparser.ast.stmt.Statement;importcom.github.javaparser.utils.CodeGenerationUtils;importcom.github.javaparser.utils.SourceRoot;importjava.io.File;importjava.io.IOException;importjava.nio.file.Path;importjava.nio.file.Paths;publicclassAddLogging{publicstaticvoidmain(String[]args)throwsIOException{//假设我们要处(chu)理src/main/java目(mu)录下的(de)所(suo)有文件PathsourceDir=Paths.get("src/main/java");SourceRootsourceRoot=newSourceRoot(sourceDir);sourceRoot.walk(compilationUnit->{compilationUnit.findAll(MethodDeclaration.class).forEach(method->{//简单起(qi)见,我们假设(she)所(suo)有public方(fang)法都需要(yao)添加日志if(method.isPublic()&&!method.isConstructor()&&!method.getNameAsString().equals("toString")){//排除构造(zao)函数和(he)toStringBlockStmtbody=method.getBody().orElseThrow(()->newIllegalStateException("Methodhasnobody"));//1.添(tian)加方(fang)法开始日(ri)志ExpressionlogStart=newMethodCallExpr(newNameExpr("log"),"info",newStringLiteralExpr("Enteringmethod:"+method.getNameAsString()));body.addStatement(0,newExpressionStmt(logStart));//2.添(tian)加方(fang)法(fa)结束日志(zhi)(需(xu)要处理返(fan)回值)//这里的处(chu)理比(bi)较复杂,需要根(gen)据方(fang)法返(fan)回类型决定如(ru)何包装(zhuang)//为了(le)简(jian)化,我们(men)这里(li)只(zhi)演示(shi)一个(ge)基本(ben)结构(gou)//实际应用(yong)中,可(ke)能需(xu)要生成一个(ge)try-finally块(kuai)来确保(bao)日志打印StatementlogEnd=newExpressionStmt(newMethodCallExpr(newNameExpr("log"),"info",newStringLiteralExpr("Exitingmethod:"+method.getNameAsString())));body.addStatement(logEnd);}});});//将(jiang)修改(gai)后的代(dai)码(ma)写回文件sourceRoot.saveAll();System.out.println("Loggingaddedsuccessfully!");}}
这段(duan)代码展(zhan)示了如(ru)何找到所有(you)方(fang)法,并(bing)在(zai)方法体(ti)开头添加一个(ge)日志打(da)印(yin)语句(ju),在方法(fa)体(ti)末(mo)尾(wei)添(tian)加一个(ge)结束(shu)日志。这只(zhi)是一(yi)个(ge)基(ji)础的示例(li),更复杂的(de)场景,比如(ru)根(gen)据方法(fa)返回类(lei)型、参(can)数(shu)类型来生(sheng)成更(geng)详细的日(ri)志,都需要对AST有(you)更深入的理(li)解和更精细(xi)的操作。
你可以编(bian)写JavaParser脚(jiao)本来检查(cha)代码是否符合(he)特定的命(ming)名规(gui)范、是(shi)否有(you)未使(shi)用的变量(liang)、是(shi)否(fou)遵循(xun)特定(ding)的编(bian)码风格等(deng)。
importcom.github.javaparser.StaticJavaParser;importcom.github.javaparser.ast.CompilationUnit;importcom.github.javaparser.ast.body.VariableDeclarator;importcom.github.javaparser.ast.visitor.VoidVisitorAdapter;importjava.io.File;importjava.io.FileNotFoundException;importjava.util.ArrayList;importjava.util.List;publicclassCodeConventionChecker{publicstaticvoidmain(String[]args)throwsFileNotFoundException{StringfilePath="path/to/your/JavaFile.java";//替换(huan)为(wei)你的Java文(wen)件路(lu)径CompilationUnitcu=StaticJavaParser.parse(newFile(filePath));Listissues=newArrayList<>();newConventionVisitor(issues).visit(cu,null);System.out.println("CodeConventionIssues:");if(issues.isEmpty()){System.out.println("Noissuesfound.");}else{issues.forEach(System.out::println);}}privatestaticclassConventionVisitorextendsVoidVisitorAdapter{privatefinalListissues;publicConventionVisitor(Listissues){this.issues=issues;}@Overridepublicvoidvisit(VariableDeclaratorn,Voidarg){super.visit(n,arg);//检查变(bian)量名是否(fou)以小(xiao)写字(zi)母开(kai)头(驼峰(feng)命(ming)名法)if(!Character.isLowerCase(n.getNameAsString().charAt(0))){issues.add("Variablenamingconventionviolation:'"+n.getNameAsString()+"'shouldstartwithalowercaseletteratline"+n.getRange().map(r->r.begin.line).orElse(-1));}}//可(ke)以继续(xu)添加(jia)其(qi)他检(jian)查(cha),例如://-检(jian)查(cha)方法(fa)名是(shi)否符(fu)合规(gui)范//-检(jian)查类名是(shi)否以大写(xie)字母开头(tou)//-检(jian)查(cha)是否(fou)有public字(zi)段(duan)}}
这个(ge)例(li)子展示了(le)如何(he)检(jian)查变(bian)量命名(ming)规范。你(ni)可以轻(qing)松地(di)扩展(zhan)这个(ge)ConventionVisitor,添(tian)加更(geng)多(duo)规(gui)则(ze),构建(jian)一个属于(yu)你自(zi)己(ji)的(de)代码(ma)审(shen)查工(gong)具(ju),将繁(fan)琐(suo)的(de)人工审查(cha)变(bian)成(cheng)自动化的(de)、高效的流(liu)程。
掌握(wo)了JavaParser的基本用法和一些实(shi)战技(ji)巧后,如(ru)何将(jiang)其(qi)真正融入(ru)你的(de)开(kai)发流程(cheng),实现效率的(de)“指数级(ji)”增长(zhang)?
从重复性(xing)任务开(kai)始(shi):找出(chu)你日常开发中(zhong)最频(pin)繁(fan)、最(zui)枯燥(zao)的重(zhong)复性(xing)任务(wu),例如生成POJO、DTO,或者(zhe)编写单(dan)元测试(shi)的(de)模(mo)板代码(ma),然(ran)后尝试用JavaParser将其(qi)自动(dong)化。构建代码生成器:根据DSL(领(ling)域(yu)特(te)定语言(yan))、配置文件(jian)或(huo)数(shu)据(ju)库(ku)结构,自动(dong)生成代码(ma)。
这在(zai)微服(fu)务、ORM等(deng)领域(yu)非常有价(jia)值(zhi)。定(ding)制(zhi)IDE插件:将(jiang)你的(de)JavaParser脚本(ben)集(ji)成到IDE(如(ru)IntelliJIDEA,Eclipse)的插(cha)件中,让代(dai)码的分析(xi)、修改(gai)和(he)生成变得触(chu)手可(ke)及。持续(xu)学(xue)习与探(tan)索:JavaParser的功(gong)能远(yuan)不止于此。
它(ta)支持注解处(chu)理(li)、静态(tai)分(fen)析、重(zhong)构等高级(ji)特性(xing)。多阅(yue)读官(guan)方文(wen)档,多参考社区的(de)优秀(xiu)案(an)例,不断拓展你的(de)视(shi)野。
“人妻”的智慧(hui),在于(yu)能(neng)够(gou)精打(da)细算,找到最优的解决方(fang)案。而(er)JavaParser,就是你手(shou)中(zhong)那把最(zui)锋利(li)的(de)“瑞(rui)士军刀”,能(neng)够帮你洞(dong)察代(dai)码的本质,掌(zhang)控(kong)代(dai)码的结(jie)构(gou),最终将(jiang)你的(de)开(kai)发(fa)效率提升(sheng)到(dao)一(yi)个全(quan)新的(de)境界(jie)。
从(cong)今(jin)天起(qi),就(jiu)让JavaParser成为(wei)你代码世界里的得力助手,让(rang)繁琐的编程任(ren)务变(bian)得(de)轻(qing)松愉(yu)快,让你在高效(xiao)工作的和温馨生活(huo)的(de)平(ping)衡中,游刃(ren)有(you)余(yu)。让我(wo)们一起,用(yong)智慧(hui)和(he)工具,构建更(geng)美好(hao)的(de)软(ruan)件世(shi)界(jie)!
2025-11-02,孟若雨黑色巧克力,午评:创业板指半日涨0.21%,雅江水电概念集体走强
1.日本私人庭院景观免费版网站,“卤味三巨头”上半年:门店缩减超千家,探索新业务寻增量老师脱让学生WWW345,泽连斯基称与特朗普讨论了安全相关事宜 需要与普京会晤
图片来源:每经记者 陈树威
摄
2.桃乃木香奈磁力全集资源+白虎粉嫩鲍鱼自慰喷水,苏州银行:全部赎回45亿元二级资本债券
3.超污软件大全下载+黄化半次元,美国8月份制造业采购经理指数报53 初步数据为53.3
河南闹伴娘3.23完整版+草莓视频深夜放松自己,BNP PARIBAS SA在中国平安的持股比例于9月5日从5.40%降至4.95%
八重神子奖励旅行者免费-八重神子奖励旅行者免费最新版
封面图片来源:图片来源:每经记者 名称 摄
如需转载请与《每日经济新闻》报社联系。
未经《每日经济新闻》报社授权,严禁转载或镜像,违者必究。
读者热线:4008890008
特别提醒:如果我们使用了您的图片,请作者与本站联系索取稿酬。如您不希望作品出现在本站,可联系金年会要求撤下您的作品。
欢迎关注每日经济新闻APP