数据库班级字段怎么定义名称_班级名称
數(shù)據(jù)庫(kù)班級(jí)字段怎么定義名稱
在Java中,每個(gè)類都有一個(gè)名稱。 類位于包中,這使我們程序員可以一起工作,避免名稱沖突。 我可以命名我的班級(jí)A ,也可以命名您的班級(jí)A ,只要它們位于不同的程序包中,它們可以很好地協(xié)同工作。
如果您查看Class的API,您肯定會(huì)注意到有三種不同的方法為您提供類的名稱:
- getSimpleName()為您提供不帶包的類的名稱。
- getName()為您提供類的名稱,其全包名稱位于前面。
- getCanonicalName()為您提供類的規(guī)范名稱。
簡(jiǎn)單嗎? 好吧,第一個(gè)很簡(jiǎn)單,第二個(gè)也很有意義,除非存在令人不安的規(guī)范名稱。 這還不是很明顯。 而且,如果您不知道規(guī)范名稱是什么,那么您可能還會(huì)感到Java技能的力量受到干擾。 兩者有什么區(qū)別?
如果您想進(jìn)行準(zhǔn)確的解釋,請(qǐng)?jiān)L問Java語(yǔ)言規(guī)范6.7章 。 在這里,我們進(jìn)行一些更簡(jiǎn)單,更簡(jiǎn)單的理解,盡管不夠全面。
讓我們看一些例子:
package pakage.subpackage.evensubberpackage; import org.junit.Assert; import org.junit.Test;public class WhatIsMyName {@Testpublic void classHasName() {final Class<?> klass = WhatIsMyName.class;final String simpleNameExpected = "WhatIsMyName";Assert.assertEquals(simpleNameExpected, klass.getSimpleName());final String nameExpected = "pakage.subpackage.evensubberpackage.WhatIsMyName";Assert.assertEquals(nameExpected, klass.getName());Assert.assertEquals(nameExpected, klass.getCanonicalName()); } ...這種“單元測(cè)試”運(yùn)行得很好。 但是正如您所看到的,在這種情況下,名稱和規(guī)范名稱沒有區(qū)別。 (請(qǐng)注意,程序包的名稱是pakage而不是package 。要測(cè)試您的Java詞匯技巧,請(qǐng)回答為什么?)
讓我們看一下來(lái)自同一junit測(cè)試文件的下一個(gè)示例:
@Testpublic void arrayHasName() {final Class<?> klass = WhatIsMyName[].class;final String simpleNameExpected = "WhatIsMyName[]";Assert.assertEquals(simpleNameExpected, klass.getSimpleName());final String nameExpected = "[Lpakage.subpackage.evensubberpackage.WhatIsMyName;";Assert.assertEquals(nameExpected, klass.getName());final String canonicalNameExpected = "pakage.subpackage.evensubberpackage.WhatIsMyName[]";Assert.assertEquals(canonicalNameExpected, klass.getCanonicalName()); }現(xiàn)在有區(qū)別。 當(dāng)我們談?wù)摂?shù)組時(shí),簡(jiǎn)單的名稱會(huì)發(fā)出信號(hào),即在其后面加上了括號(hào),就像在Java源代碼中所做的那樣。 “正常”名稱看起來(lái)有點(diǎn)怪異。 它以L開頭并附加分號(hào)。 這反映了JVM中類名的內(nèi)部表示。 規(guī)范名稱的更改與簡(jiǎn)單名稱類似:對(duì)于以前的類,其類具有所有包名稱作為前綴并附加了方括號(hào)。 似乎getName()更像是該類的JVM名稱,而getCanonicalName()更像是Java源代碼級(jí)別的完全限定名稱。
讓我們繼續(xù)其他示例(我們?nèi)栽谕晃募?#xff09;:
class NestedClass{}@Testpublic void nestedClassHasName() {final Class<?> klass = NestedClass.class;final String simpleNameExpected = "NestedClass";Assert.assertEquals(simpleNameExpected, klass.getSimpleName());final String nameExpected = "pakage.subpackage.evensubberpackage.WhatIsMyName$NestedClass";Assert.assertEquals(nameExpected, klass.getName());final String canonicalNameExpected = "pakage.subpackage.evensubberpackage.WhatIsMyName.NestedClass";Assert.assertEquals(canonicalNameExpected, klass.getCanonicalName()); }區(qū)別在于類名稱中的美元符號(hào)。 同樣,“名稱”更多是JVM使用的名稱,而規(guī)范名稱是Java源代碼之類的名稱。 如果編譯此代碼,則Java編譯器將生成以下文件:
- WhatIsMyName.class和
- WhatIsMyName$NestedClass.class
即使該類被命名為嵌套類,它實(shí)際上也是一個(gè)內(nèi)部類。 但是在命名上沒有什么區(qū)別:另一個(gè)類中的靜態(tài)或非靜態(tài)類僅被命名為相同。 現(xiàn)在,讓我們看一些更有趣的東西:
@Testpublic void methodClassHasName() {class MethodClass{};final Class<?> klass = MethodClass.class;final String simpleNameExpected = "MethodClass";Assert.assertEquals(simpleNameExpected, klass.getSimpleName());final String nameExpected = "pakage.subpackage.evensubberpackage.WhatIsMyName$1MethodClass";Assert.assertEquals(nameExpected, klass.getName());final String canonicalNameExpected = null;Assert.assertEquals(canonicalNameExpected, klass.getCanonicalName());}這次我們?cè)诜椒▋?nèi)部有一個(gè)類。 這不是通常的情況,但是從Java語(yǔ)言的角度來(lái)看是有效的。 類的簡(jiǎn)單名稱就是這樣:類的簡(jiǎn)單名稱。 沒什么奇怪的。
但是,“正常”名稱很有趣。 Java編譯器為該類生成一個(gè)JVM名稱,并且該名稱中包含一個(gè)數(shù)字。 為什么? 因?yàn)闆]有什么可以阻止我在測(cè)試類的另一個(gè)方法中擁有一個(gè)具有相同名稱的類,并插入數(shù)字是防止JVM名稱沖突的方法。 JVM不了解或不關(guān)心內(nèi)部和嵌套類或方法內(nèi)部定義的類。 一課就是一課。 如果編譯代碼,則可能會(huì)看到j(luò)avac生成的文件WhatIsMyName$1MethodClass.class 。 我必須添加“可能”不是因?yàn)槲矣?jì)算出您可能會(huì)盲目,而是因?yàn)樵撁Q實(shí)際上是Java編譯器的內(nèi)部問題。 它可能會(huì)選擇其他避免名稱沖突的策略,盡管我不知道有什么不同于上面的編譯器。
規(guī)范名稱是最有趣的。 它不存在! 它為空。 為什么? 因?yàn)槟荒軓亩x它的方法之外訪問此類。 它沒有規(guī)范名稱。 我們繼續(xù)。
匿名類呢? 他們不應(yīng)該有名字。 畢竟,這就是為什么它們被稱為匿名的原因。
@Testpublic void anonymousClassHasName() {final Class<?> klass = new Object(){}.getClass();final String simpleNameExpected = "";Assert.assertEquals(simpleNameExpected, klass.getSimpleName());final String nameExpected = "pakage.subpackage.evensubberpackage.WhatIsMyName$1";Assert.assertEquals(nameExpected, klass.getName());final String canonicalNameExpected = null;Assert.assertEquals(canonicalNameExpected, klass.getCanonicalName());}實(shí)際上,它們沒有簡(jiǎn)單的名稱。 簡(jiǎn)單名稱是空字符串。 它們確實(shí)具有名稱,但由編譯器組成。 較差的javac沒有其他選擇。 它甚至必須為未命名的類組成一些名稱。 它必須為JVM生成代碼,并且必須將其保存到某個(gè)文件中。 規(guī)范名稱再次為null。
我們已經(jīng)準(zhǔn)備好示例了嗎? 否。最后我們有一些簡(jiǎn)單的東西(又稱原始)。 Java基元。
@Testpublic void intClassHasName() {final Class<?> klass = int.class;final String intNameExpected = "int";Assert.assertEquals(intNameExpected, klass.getSimpleName());Assert.assertEquals(intNameExpected, klass.getName());Assert.assertEquals(intNameExpected, klass.getCanonicalName());}如果該類表示一個(gè)原語(yǔ),例如int (什么比int還要簡(jiǎn)單?),則簡(jiǎn)單名稱,“ the”名稱和規(guī)范名稱全都是int該原語(yǔ)的名稱。
就像原始數(shù)組一樣非常簡(jiǎn)單嗎?
@Testpublic void intArrayClassHasName() {final Class<?> klass = int[].class;final String simpleNameExpected = "int[]";Assert.assertEquals(simpleNameExpected, klass.getSimpleName());final String nameExpected = "[I";Assert.assertEquals(nameExpected, klass.getName());final String canonicalNameExpected = "int[]";Assert.assertEquals(canonicalNameExpected, klass.getCanonicalName());}好吧,這并不簡(jiǎn)單。 名稱為[I ,這有點(diǎn)神秘,除非您閱讀JVM規(guī)范的相應(yīng)章節(jié) 。 也許我再說一次。
結(jié)論
類的簡(jiǎn)單名稱很簡(jiǎn)單。 對(duì)于JVM級(jí)別的事情, getName()返回的“名稱”是一個(gè)有趣的東西。 getCanonicalName()是最像Java源代碼的那個(gè)。
- 您可以從GitHub的g789 e789d700d3c9abc6afa0獲得上述示例的完整源代碼。
翻譯自: https://www.javacodegeeks.com/2014/09/name-of-the-class.html
數(shù)據(jù)庫(kù)班級(jí)字段怎么定義名稱
總結(jié)
以上是生活随笔為你收集整理的数据库班级字段怎么定义名称_班级名称的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为新品发布会(华为新品发布会2022下
- 下一篇: 使用Testcontainers和Pos