


版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Java? 5泛型提供了對(duì)于許多classworking都非常有用的信息。盡管Java反射可用于為載入的類獲取泛型信息,但要求類必須載入到JVM中,這是一個(gè)很大的缺點(diǎn)。在本文中,classworki ng精神領(lǐng)袖 De nnis Sos noski展示了 ASM Java字節(jié)碼操縱框架怎樣在無(wú)需經(jīng)過(guò)Java classloading處理的情況下提供對(duì)泛型信息的靈活訪問(wèn)。 型的二進(jìn)制類表示。Java 5程序中的泛型信息對(duì)于理解程序的數(shù)據(jù)結(jié)構(gòu)非常有幫助。 了如何使用運(yùn)行時(shí)反射來(lái)訪問(wèn)泛型信息。如果您僅對(duì)獲得載入在文中,他還深入探討了泛在上一期 中,我為您介紹 JVM中的類的信息感興趣,那么這種反射方
2、法非常有效。但有時(shí)您可能希望在載入類之前對(duì)其加以修改,或者希望在不載入類的情況下研究數(shù)據(jù)結(jié)構(gòu)。在這樣的時(shí)候,反射對(duì)您來(lái)說(shuō)就不再是一種行之有效的辦法反射將JVM類結(jié)構(gòu)作為信息源使用,因此它僅對(duì)已由JVM裝載的類起作用。要想在不將類載入 JVM的情況下訪問(wèn)泛型信息,您需要一種讀取存儲(chǔ)在二進(jìn)制類表示內(nèi)的 泛型信息的方法。在前幾期文章中,已經(jīng)介紹過(guò)ASM classworki ng庫(kù)是怎樣提供了一種清潔的接口,以讀取及寫(xiě)入二進(jìn)制類。在這篇文章中,我將向您展示如何利用ASM從類文ASP細(xì)節(jié)之前,讓我們件中獲取原始泛型信息,如何以一種有用的方式解釋泛型。在鉆研 首先來(lái)看看泛型信息編碼到二進(jìn)制類中的實(shí)際方式
3、。跟蹤泛型為將可由Java編譯器使用的鍵入信息添加到Java二進(jìn)制類中,需要使用泛型規(guī)范設(shè)計(jì)器。幸運(yùn)的是,Java平臺(tái)已有一種內(nèi)置于二進(jìn)制類格式中的機(jī)制,可用于此目的。這種機(jī) 制就是屬性結(jié)構(gòu)(attribute structure),它主要使所有類型的信息可與類本身或類的方法、字 段及其他組件相關(guān)聯(lián)。某些類型的屬性信息是由JVM規(guī)范定義的,但Java語(yǔ)言的原始設(shè)計(jì)器作出了明智的選擇,將一組可能出現(xiàn)的屬性保留為開(kāi)放,從而可由新版本的規(guī)范加以擴(kuò)展,也可由用戶擴(kuò)展以設(shè)計(jì)其自己的自定義屬性。泛型信息存儲(chǔ)在一個(gè)新的標(biāo)準(zhǔn)屬性中: 簽名 屬性。該屬性是一個(gè)簡(jiǎn)單的文本值,為類、字 段、方法或變量解碼泛型信息。
4、更新的Java 5 JVM規(guī)范(參考資料 部分給出了 Java 5更改頁(yè)面的鏈接)清楚地說(shuō)明了簽名文本值的完整語(yǔ)法。在這里我不打算加以詳述,但本節(jié)稍后的部分中會(huì)簡(jiǎn)單介紹簽名。首先將介紹一些必備的背景信息,以使您了解類名稱的內(nèi)部結(jié)構(gòu)及JVM所使用的字段和方法描述符。深入內(nèi)部Java平臺(tái)中的類總是來(lái)自某些包。當(dāng)您在Java源代碼中引用類名稱時(shí),您或許會(huì)也或許不會(huì)真正將包限定作為名稱的一部分。您總是可以包含包限定(形如 java.lang.String ),但您也可以為了省事而忽略它如果類來(lái)自java.lang包或已import到源文件中。這種包含包限定的類名稱結(jié)構(gòu)就稱為完全限定”類名。在實(shí)際的二進(jìn)
5、制類內(nèi)部,類名稱總是在一個(gè)包中指定的。但這種名稱的格式與Java源代碼中的完全限定類名略有差別,使用正斜杠(“/”取代圓點(diǎn)(“。例如,在 String類中,名稱的內(nèi)部形式 為java/lang/String。如果您嘗試將一個(gè)類文件作為文本輸出或查看,那么通 常會(huì)看到上述形式的多個(gè)字符串,每個(gè)字符串都是對(duì)某個(gè)類的引用。采用這種內(nèi)部形式的類引用是作為字段和方法描述符的一部分使用的。字段描述符 指定類中定義的一個(gè)類的準(zhǔn)確類型。所使用的表示法取決于字段是簡(jiǎn)單對(duì)象類型、簡(jiǎn)單原語(yǔ)類型還是數(shù)組類型。簡(jiǎn)單對(duì)象類型的表示法為,以L開(kāi)頭,后接對(duì)象類名稱的內(nèi)部形式,以;結(jié)尾。原語(yǔ)類型的表示法為,各類型使用一個(gè)單獨(dú)的
6、字母(如 I表示int、Z'表示布爾型)。 數(shù)組類型的表示法為,以作為數(shù)組項(xiàng)類型(其本身也可為數(shù)組類型)的前綴修飾符。表1給出了關(guān)于各字段描述符的示例,另外還列出了相應(yīng)的Java源代碼聲明:表1.字段描述符示例Ljava/la ng/Stri ng;Stri ngIintLjava/la ng/Object;ObjectZboolea nLcom/sos no ski/ge nerics/File Info;com.sos no ski.ge nerics.File In fo方法描述符 結(jié)合了字段描述符,以指定方法的參數(shù)類型和返回類型。方法描述符的格式非 常易于理解。以 ('
7、開(kāi)始,后接參數(shù)的字段描述符(均一起運(yùn)行),隨后是,最后以返回類型結(jié)尾(若返回類型為void,則以V結(jié)尾)。表2給出了方法描述符的一些示例,同時(shí)還列出了相應(yīng)的Java源代碼聲明(注意方法名稱和參數(shù)名稱本身并非方法描述符的一部分,所以在表中使用了占位符):表2.方法描述符示例描述符源代碼(Ljava/la ng/Stri ng;)lint mmm(Stri ng x)(ILjava/la ng/Stri ng;)Vvoid mmm(i nt x, String y)(I)Ljava/la ng/Stri ng;Stri ng mmm(int x)(Ljava/la ng/Stri ng;)Ccha
8、r mmm(Stri ng x)(ILjava/la ng/Stri ng;Lcom/sos no ski/ge nerics/Filel nfo;)Vvoid mmm(int x, Stri ng y, FileI nfoz)在虛線處簽名上面已經(jīng)介紹了字段和方法描述符,那么接下來(lái)將介紹簽名。簽名格式擴(kuò)展了字段和方法描述符的概念,將泛型類型信息包含于其中。不幸的是,泛型的復(fù)雜性(包括可能出現(xiàn)的各種 上下界變化等)意味著簽名無(wú)法像描述符那樣簡(jiǎn)單地說(shuō)明。簽名的語(yǔ)法(詳見(jiàn)JVMspecification changes for Java 1.5的第 4章)包含 21個(gè)獨(dú)立產(chǎn)品項(xiàng)。本文無(wú)法全面涉及,
9、這里將給出幾個(gè)示例,下一節(jié)將針對(duì)這部分示例展開(kāi)講解。清單1是上一期文章中所用的一個(gè)數(shù)據(jù)結(jié)構(gòu)類的部分源代碼,以及相應(yīng)的簽名字符串。在本例中,類本身并非參數(shù)化類型,但字段和方法使用了參數(shù)化的java.util.List :清單1.簡(jiǎn)單的簽名示例public class DirI nfoprivate final List<FileInfo> m_files;private final List<DirInfo> m_directories;public List<Dirl nfo> getDirectories() return m_directories;pu
10、blic List<File lnfo> getFiles() return m_files;Class sig nature:nonem_files sig nature:Ljava/util/List<Lcom/sos no ski/ge nerics/Filel nfo;>m_directories sig nature:Ljava/util/List<Lcom/sos no ski/ge nerics/Dirl nfo;> getDirectories() sig nature:()Ljava/util/List<Lcom/sos no ski
11、/ge nerics/Dirl nfo;>getFiles() sig nature:()Ljava/util/List<Lcom/sos no ski/ge nerics/Filel nfo;>由于類并非參數(shù)化類型,所以未為該類本身的二進(jìn)制類表示添加任何簽名。但確實(shí) 為使用參數(shù)化類型的字段和方法使用了簽名。m_files字段簽名表示這是一個(gè)List,且類型為FileInfo ;而 m_directories字段簽名則表示這是一個(gè)類型為DirInfo 的List。同樣,getDirectories()方法簽名表示該方法返回一個(gè)類型為DirInfo的List,而getFiles
12、()簽名則表示該方法返回一個(gè)類型為File Info的List。迄今為止,一切看起來(lái)都相當(dāng)容易理解,但事實(shí)真是如此嗎?下面讓我們看看清單2,其中給出了一個(gè)簡(jiǎn)單的參數(shù)化類定義和相應(yīng)的簽名字符串:清單2.參數(shù)化類簽名示例public class PairCollect ion< T,U> impleme nts Iterable<T>/* Collection with first component values. */private final ArrayList<T> m_tValues;/* Collecti on with sec ond comp o
13、nent values. */ private final ArrayList<U> m_uValues;public void add(T t, U u) m_tValues.add(t); m_uValues.add(u);public U get(T t) int in dex = m_tValues.i ndexOf(t);if (in dex >= 0) retur n m_uValues.get(i ndex); else return n ull;Class sig nature:<T:Ljava/la ng/Object;U:Ljava/la ng/Ob
14、ject;>Ljava/la ng/Object;Ljava/la ng/lterable<TT;>m_tValues sig nature:Ljava/util/ArrayList<TT;>m_uValues sig nature:Ljava/util/ArrayList<TU;>add sig nature:(TT;TU;)Vget sig nature:(TT;)TU;由于清單2中的類為參數(shù)化類型,所以類簽名需要以二進(jìn)制類形式表示。與源代碼相比, 簽名的文本要長(zhǎng)一些,但如果您了解到,源代碼中省略的類型參數(shù)的所有可選組件都包含在簽名中,那么理解起來(lái)
15、也就不太困難了。簽名的第一部分(位于尖括號(hào)<>內(nèi))就是該類的類型參數(shù)定義清單。這些定義的形式都相同,類型參數(shù)名稱后接類型的類邊界和接口邊 界(若存在)的字段描述符。各字段描述符前加:字符。由于清單 2源代碼未為類的類型參數(shù)指定任何邊界,因此其邊界均為默認(rèn)的類邊界java.lang.Object。類簽名的第二部分(尖括號(hào)外)給出了超類和超接口(若存在)的簽名。在清單2所示的例子中,未指定任何超類,因此簽名以java.lang.Object作為超類。這里指定了超接口,為Iterable<T>。在簽名中可以看到預(yù)期結(jié)果,源代碼中使用的只是 <T>'而簽名中
16、使用的是 <TT;>。'原因在于簽名需要區(qū)分類名稱和類型變量名稱,第一個(gè) 1標(biāo)識(shí)緊隨其后的內(nèi)容為類型變量名,而結(jié)尾的;表示名稱結(jié)束。清單2中的字段和方法簽名利用了與超接口簽名相同的變量格式類型,其他都與前面介紹 的內(nèi)容相同。回頁(yè)首 ASM中的泛型本系列的前幾期文章中已介紹過(guò)(鏈接參見(jiàn)參考資料部分),ASM使用了一種訪問(wèn)器(visitor)模式來(lái)處理二進(jìn)制類表示。這種訪問(wèn)器模式是雙向的:您可以解析一個(gè)現(xiàn)有類,得 到類組件的處理程序訪問(wèn)器方法的調(diào)用序列,也可以實(shí)現(xiàn)對(duì)類寫(xiě)入器的訪問(wèn)器方法的同類調(diào)用序列,以生成一個(gè)二進(jìn)制類表示。這一解析器/寫(xiě)入器對(duì)稱使 ASM在您僅修改類的特定方面
17、的情況下尤為方便一一您可將類寫(xiě)入器作為類解析器事件的處理程序的基礎(chǔ),僅重寫(xiě)基寫(xiě)入器來(lái)處理您想更改的事件。解析器(或讀取器)和寫(xiě)入器都是非常有用的獨(dú)立組件。ASM 2.X全面支持 Java 5 JVM更改,包括讀取和寫(xiě)入簽名。簽名的基本處理是通過(guò)直接 傳遞給恰當(dāng)?shù)脑L問(wèn)器方法的值自動(dòng)實(shí)現(xiàn)的。另外,ASM 2.X還增加了對(duì)簽名字符串(有時(shí)非常復(fù)雜)編碼進(jìn)行解析的支持,從而可翻譯簽名細(xì)節(jié)。按照ASM的基本原理,相同的接口還可供寫(xiě)入器使用以按需生成簽名字符串。在這一節(jié)中,我將介紹ASM如何將基本簽名作為text blob處理,又是如何詳細(xì)解析基本簽名的。所有部分的簽名ASM中將簽名作為text blob
18、處理,這一方式直接內(nèi)建于基本類、字段和方法的訪問(wèn)器調(diào)用中。清單 3展示了 org.objectweb.asm.ClassVisitor接口中的相應(yīng)方法:清單3.類、字段和方法的訪問(wèn)器方法public in terface ClassVisitorvoid visit(i nt vers ion, int access, String n ame, String sig nature,String superName, Strin g in terfaces);FieldVisitor visitField(int access, String name. String desc.String
19、sig nature. Object value);MethodVisitor visitMethod(i nt access, String n ame, String desc,String sig nature. Strin g excepti on s);清單中的各訪問(wèn)器方法將簽名字符串作為參數(shù)。若相應(yīng)的類、字段或方法非泛型,則在調(diào)用方法時(shí)將返回null值。清單 4顯示了簽名相關(guān)方法的實(shí)際應(yīng)用。其中用 mons.EmptyVisitor 類作為基礎(chǔ)實(shí)現(xiàn)了一個(gè)訪問(wèn)器類,這樣我只需重寫(xiě)想使用的方法即可。所提供的方法實(shí)現(xiàn)僅輸出整體簽名信息、本清單所示類中各字段和方法的描述符和簽名信息。清單4
20、的末尾處展示了在清單1所示的完整DirInfo類中使用此訪問(wèn)器時(shí)所生成的輸出:清單4.簽名相關(guān)方法的實(shí)際應(yīng)用public class ShowSig naturesVisitor exte nds EmptyVisitorpublic void visit(int version, int access, String name, String sig,String sname, String inames) System.out.pri ntln ("Class " + n ame + " sig nature:");System.out.printl
21、n("" + sig);super.visit(vers ion, access, n ame, sig, sn ame, in ames);public FieldVisitor visitField(int access, String name, String desc,String sig, Object value) System.out.pri ntl n("Field " + n ame + " descriptor and sig nature:");System.out.println("" +
22、desc);System.out.println("" + sig);retur n super.visitField(access, n ame, desc, sig, value);public MethodVisitor visitMethod(i nt access, String n ame, String desc,String sig, Strin g excepti ons) System.out.pri ntln ("Method " + n ame + "() descriptor and sig nature:"
23、);System.out.println("" + desc);System.out.println("" + sig);retur n super.visitMethod(access, n ame, desc, sig, excepti on s);Class com/sos no ski/ge nerics/Dirl nfo sig nature:nullField m_files descriptor and sig nature:Ljava/util/List;Ljava/util/List<Lcom/sos no ski/ge neri
24、cs/Filel nfo;>Field m_directories descriptor and sig nature:Ljava/util/List;Ljava/util/List<Lcom/sos no ski/ge nerics/Dirl nfo;>Field m_l astModify descriptor and sig nature: Ljava/util/Date;nullMethod <in it>() descriptor and sig nature:(Ljava/io/File;)VnullMethod getDirectories() de
25、scriptor and sig nature: ()Ljava/util/List;()Ljava/util/List<Lcom/sos no ski/ge nerics/Dirl nfo;>Method getFiles() descriptor and sig nature: ()Ljava/util/List;()Ljava/util/List<Lcom/sos no ski/ge nerics/Filel nfo;>Method getLastModify() descriptor and sig nature: ()Ljava/util/Date;null簽
26、名分析除將簽名作為字符串處理外,ASM 還支持在細(xì)節(jié)級(jí)處理簽名。 org.objectweb.asm.sig nature.Sig natureReader 類解 析一個(gè)簽名字 符串,并生成對(duì) org.objectweb.asm.sig nature.Sig naturevisitor接 口 的 調(diào) 用 序 歹U 。org.objectweb.asm.signature.Signaturewriter類實(shí)現(xiàn)訪問(wèn)器接口,并從訪問(wèn)器方法調(diào)用序列中 構(gòu)建出簽名字符串。很不幸,細(xì)節(jié)級(jí)接口有些復(fù)雜,但其原因在于簽名定義的復(fù)雜性,而不是ASM代碼處理不力。SignatureVisitor接口展現(xiàn)了這一復(fù)雜
27、性,它定義了16個(gè)可在簽名處理過(guò)程中包含的獨(dú)立方法調(diào)用。當(dāng)然,絕大多數(shù)簽名僅使用這些方法中的一小部分。為舉例說(shuō)明 ASM的細(xì)節(jié)級(jí)簽名處理,我將解析本文前面所討論的某些簽名,從而介紹方 法。為此,我編寫(xiě)了TraceSignatureVisitor類,清單 5展示了該類的部分代碼,該清單中的 AnalyzeSignaturesVisitor 用于驅(qū)動(dòng)簽名處理。當(dāng)AnalyzeSignaturesVisitor 用做類的訪問(wèn)器時(shí),它會(huì)為所發(fā)現(xiàn)的各簽名創(chuàng)建一個(gè)SignatureReader,將TraceSignatureVisitor類的一個(gè)實(shí)例作為簽名組件訪問(wèn)器調(diào)用的目標(biāo)傳遞。用于解析簽名的Sign
28、atureReader調(diào)用取決于簽名的形式:對(duì)于類和方法簽名,恰當(dāng)?shù)姆椒ㄊ?accept();對(duì)于字段簽名,應(yīng)使用acceptType()調(diào)用。清單5.簽名分析public class TraceSig natureVisitor impleme nts Sig natureVisitorpublic void visitFormalTypeParameter(Stri ng n ame) System.out.pri ntln (”visitFormalTypeParameter(” + n ame + ")");public Sign atureVisitor visi
29、tClassBo un d() System.out.pri ntl n("visitClassBou nd()");return this;public Sign atureVisitor visit In terfaceBo un d() System.out.pri ntln (”visit In terfaceBo un d()");return this;public Sign atureVisitor visitSuperclass() System.out.pri ntln (”visitSuperclass()");return this
30、;public Sign atureVisitor visitI nterface() System.out.pri ntln (”visit In terface()");return this;public Sign atureVisitor visitParameterType() System.out.pri ntln (”visitParameterType()");return this;public class AnalyzeSignaturesVisitor extends EmptyVisitorpublic void visit(int version,
31、 int access, String name, String sig,String sname, String inames) if (sig != n ull) System.out.pri ntln ("Class " + n ame + " sig nature:");System.out.println("" + sig);new Sign atureReader(sig).accept (new TraceSig natureVisitor(); super.visit(vers ion, access, n ame,
32、sig, sn ame, in ames);public FieldVisitor visitField(int access, String name, String desc,String sig, Object value) if (sig != n ull) System.out.pri ntln ("Field " + n ame + " sig nature:");System.out.println("" + sig);new Sign atureReader(sig).acceptType( new TraceSig
33、natureVisitor(); retur n super.visitField(access, n ame, desc, sig, value);public MethodVisitor visitMethod(i nt access, String n ame, String desc,String sig, Strin g excepti ons) if (sig != n ull) System.out.pri ntl n("Method " + n ame + "() sig nature:");System.out.println(&quo
34、t;" + sig);new Sign atureReader(sig).accept (new TraceSig natureVisitor();retur n super.visitMethod(access, n ame, desc, sig, excepti on s);清單6顯示了使用AnalyzeSignaturesVisitor類訪問(wèn)清單1中的Dirlnfo 類時(shí)所生成的輸出:清單6. Dirinfo代碼和簽名分析public class DirI nfoprivate final List<Filelnfo> m_files;private final L
35、ist<DirInfo> m_directories;public List<DirI nfo> getDirectories() return m_directories;public List<File lnfo> getFiles() return m_files;Field m_files sig nature:Ljava/util/List<Lcom/sos no ski/ge nerics/Filel nfo;>visitClassType(java/util/List)visitTypeArgume nt(=)visitClassT
36、ype(com/sos no ski/ge nerics/Filel nfo)visitE nd()visitE nd()Field m_directories sig nature:Ljava/util/List<Lcom/sos no ski/ge nerics/Dirl nfo;>visitClassType(java/util/List)visitTypeArgume nt(=)visitClassType(com/sos no ski/ge nerics/Dirl nfo)visitE nd()visitE nd()Method getDirectories() sig
37、nature:()Ljava/util/List<Lcom/sos no ski/ge nerics/Dirl nfo;>visitRetur nType()visitClassType(java/util/List)visitTypeArgume nt(=)visitClassType(com/sos no ski/ge nerics/Dirl nfo)visitE nd()visitE nd()Method getFiles() sig nature:()Ljava/util/List<Lcom/sos no ski/ge nerics/Filel nfo;> vi
38、sitRetur nType() visitClassType(java/util/List) visitTypeArgume nt(=) visitClassType(com/sos no ski/ge nerics/Filel nfo) visitE nd() visitE nd()清單 6 中輸出行的第一塊展示了 m_files 簽名 Ljava/util/List<Lcom/sos noski/ge nerics/Filel nfo;>的分析過(guò)程中所調(diào)用的訪問(wèn)器方法。第一個(gè)方法調(diào)用是 visitClassType("java/util/List"),給出
39、了 字段的基類。隨后 visitTypeArgument("=")說(shuō)明實(shí)際類型由當(dāng)前類的類型參數(shù) (java.util.List) 提供,visitClassType("com/sos noski/ge nerics/Filel nfo")說(shuō) 明 實(shí) 際 類 型 以com.sos noski.ge nerics.File Info 為基礎(chǔ)。最終,對(duì)visitE nd()的第一個(gè)調(diào)用關(guān)閉了打開(kāi)的File Info類簽名,第二個(gè)調(diào)用關(guān)閉了打開(kāi)的List類簽名。通過(guò)觀察訪問(wèn)器方法調(diào)用序列,您或許已經(jīng)猜到,其中部分調(diào)用有效地為嵌入的類型簽名組件打開(kāi)了一個(gè)新的上下
40、文。Sig naturevisitor接口中返回Sig naturevisitor實(shí)例的方法均有此作用。方法調(diào)用所返回的接口實(shí)例(可能與被調(diào)用的實(shí)例相同,也可能不同,清單5代碼中就是相同的)隨后用于處理嵌入的類型簽名。可很容易地對(duì)清單5所示代碼作出修改,以縮進(jìn)格式展示子簽名嵌套,本文提供的下載文件中也包含更改后的代碼。 這里不準(zhǔn)備給出詳細(xì)的代碼,僅介紹輸出結(jié)果。清單7給出了在清單2的PairCollection參數(shù)化類上運(yùn)行此縮進(jìn)版代碼時(shí)所生成的輸出結(jié)果(部分):清單7. PairCollection代碼和簽名分析public class PairCollect ion< T,U>
41、 impleme nts Iterable<T>/* Collection with first component values. */private final ArrayList<T> m_tValues;/* Collecti on with sec ond comp onent values. */private final ArrayList<U> m_uValues;public void add(T t, U u) m_tValues.add(t); m_uValues.add(u);public U get(T t) int in dex = m_tValues.i ndexOf(t);if (in dex &
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 游泳救生員初級(jí)測(cè)試題與答案
- 推拿治療學(xué)測(cè)試題+答案
- 業(yè)務(wù)學(xué)習(xí)心得體會(huì)范文
- 醫(yī)美服裝采購(gòu)合同范本
- 下半年人力資源部工作計(jì)劃
- 三年級(jí)數(shù)學(xué)綜合實(shí)踐課教案
- 中藥炮制工中級(jí)練習(xí)題(含答案)
- 辦公別墅 出租合同范本
- 建筑信息模型職業(yè)技能理論知識(shí)試題庫(kù)及參考答案
- 工程地質(zhì)與土力學(xué)練習(xí)題(含答案)
- 2024年濟(jì)南護(hù)理職業(yè)學(xué)院高職單招語(yǔ)文歷年參考題庫(kù)含答案解析
- 2025廣東省國(guó)家稅務(wù)局系統(tǒng)事業(yè)單位招聘400人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 投行競(jìng)爭(zhēng)格局-洞察分析
- 考研學(xué)習(xí)筆記 《國(guó)際貿(mào)易實(shí)務(wù)》(第6版)筆記和課后習(xí)題(含考研真題)詳解-1-200
- 2024年01月23649電氣控制與PLC期末試題答案
- 餐飲業(yè)供應(yīng)鏈管理指南
- 涵洞工程專項(xiàng)施工方案
- DB32-T 4107-2021 民用建筑節(jié)能工程熱工性能現(xiàn)場(chǎng)檢測(cè)標(biāo)準(zhǔn)
- 七年級(jí)上冊(cè)生物2024-2025學(xué)年新人教版期末綜合試卷(含答案)
- 2024年國(guó)家電網(wǎng)招聘之電工類考試題庫(kù)附答案(滿分必刷)
- 2024年全國(guó)教育大會(huì)精神全文課件
評(píng)論
0/150
提交評(píng)論