A. java 語句如何注釋
LZ好,217:C 在子類構造中在第一句隱含super();
218:B 訪問有public protect private還有默認的default
219:D
220:A,D 還有以/**開頭*/結尾的注釋
221:A
222:B 實例化和普通的引用數據類型不同
223:D 任何都可以讀寫,B是正確的 否則會出現流錯誤
224:B,D(不肯定)
225:D 11601希望對你有幫助!
B. java注釋的自定義
它類似於新創建一個介面類文件,但為了區分,我們需要將它聲明為@interface,如下例:
Java代碼
packagecom.iwtxokhtd.annotation;
public@interfaceNewAnnotation {
}
使用自定義的註解類型
Java代碼
packagecom.iwtxokhtd.annotation;
publicclassAnnotationTest {
@NewAnnotation
publicstaticvoidmain(String[] args) {
}
}
為自定義註解添加變數
Java代碼
packagecom.iwtxokhtd.annotation;
public@interfaceAnnotation {
String value();
}
Java代碼
publicclassAnnotationTest {
@NewAnnotation(main method)
publicstaticvoidmain(String[] args) {
saying();
}
@NewAnnotation(value = say method)
publicstaticvoidsaying() {
}
}
定義一個枚舉類型,然後將參數設置為該枚舉類型,並賦予默認值
public@interfaceGreeting {
publicenum FontColor {
BLUE,RED,GREEN
};
String name();
FontColor fontColor()defaultFontColor.RED;
}
這里有兩種選擇,其實變數也就是在賦予默認值的參數上,我們可以選擇使用該默認值,也可以重新設置一個值來替換默認值
Java代碼
publicclassAnnotationTest {
@NewAnnotation(main method)
publicstaticvoidmain(String[] args) {
saying();
sayHelloWithDefaultFontColor();
sayHelloWithRedFontColor();
}
@NewAnnotation(say method)
publicstaticvoidsaying() {
}
// 此時的fontColor為默認的RED
@Greeting(name = defaultfontcolor)
() {
}
@Greeting(name = notdefault, fontColor = Greeting.FontColor.BLUE)
() {
} 1.1. 限制註解的使用范圍
用@Target指定ElementType屬性
Java代碼(jdk)
packagejava.lang.annotation;
public enum ElementType {
TYPE,
// 用於類,介面,枚舉但不能是註解
FIELD,
// 欄位上,包括枚舉值
METHOD,
// 方法,不包括構造方法
PARAMETER,
// 方法的參數
CONSTRUCTOR,
//構造方法
LOCAL_VARIABLE,
// 本地變數或catch語句
ANNOTATION_TYPE,
// 註解類型(無數據)
PACKAGE
// Java包
}
1.2. 註解保持性策略
Java代碼
//限制註解使用范圍
@Target({ElementType.METHOD,ElementType.CONSTRUCTOR})
public @interface Greeting {
//使用枚舉類型
public enum FontColor{
BLUE,RED,GREEN
};
String name();
FontColor fontColor() defaultFontColor.RED;
}
在Java編譯器編譯時,它會識別在源代碼里添加的註解是否還會保留,這就是RetentionPolicy。下面是Java定義的RetentionPolicy枚舉:
編譯器的處理有三種策略:
將註解保留在編譯後的類文件中,並在第一次載入類時讀取它
將註解保留在編譯後的類文件中,但是在運行時忽略它
按照規定使用註解,但是並不將它保留到編譯後的類文件中
Java代碼
packagejava.lang.annotation;
public enum RetentionPolicy{
SOURCE,
// 此類型會被編譯器丟棄
CLASS,
// 此類型註解會保留在class文件中,但JVM會忽略它
RUNTIME
// 此類型註解會保留在class文件中,JVM會讀取它
}
Java代碼
//讓保持性策略為運行時態,即將註解編碼到class文件中,讓虛擬機讀取
@Retention(RetentionPolicy.RUNTIME)
public @interface Greeting {
//使用枚舉類型
public enum FontColor{
BLUE,RED,GREEN
};
String name();
FontColor fontColor() defaultFontColor.RED;
}
1.3. 文檔化功能
Java提供的Documented元註解跟Javadoc的作用是差不多的,其實它存在的好處是開發人員可以定製Javadoc不支持的文檔屬性,並在開發中應用。它的使用跟前兩個也是一樣的,簡單代碼示例如下:
Java代碼
//讓它定製文檔化功能
//使用此註解時必須設置RetentionPolicy為RUNTIME
@Documented
public @interface Greeting {
//使用枚舉類型
public enum FontColor{
BLUE,RED,GREEN
};
String name();
FontColor fontColor() defaultFontColor.RED;
}
1.4. 標注繼承
Java代碼
//讓它允許繼承,可作用到子類
@Inherited
public @interface Greeting {
//使用枚舉類型
public enum FontColor{
BLUE,RED,GREEN
};
String name();
FontColor fontColor() defaultFontColor.RED;
}
2. 讀取註解信息
屬於重點,在系統中用到註解許可權時非常有用,可以精確控制許可權的粒度
注意:要想使用反射去讀取註解,必須將Retention的值選為Runtime
Java代碼
packagecom.iwtxokhtd.annotation;
importjava.lang.annotation.Annotation;
importjava.lang.reflect.Method;
//讀取註解信息
{
publicstaticvoidmain(String[] args)throws Exception {
// 測試AnnotationTest類,得到此類的類對象
Class c = Class.forName(com.iwtxokhtd.annotation.AnnotationTest);
// 獲取該類所有聲明的方法
Method[] methods =c.getDeclaredMethods();
// 聲明註解集合
Annotation[] annotations;
// 遍歷所有的方法得到各方法上面的註解信息
for(Method method : methods) {
// 獲取每個方法上面所聲明的所有註解信息
annotations =method.getDeclaredAnnotations();
// 再遍歷所有的註解,列印其基本信息
System.out.println(method.getName());
for(Annotation an :annotations) {
System.out.println(方法名為: + method.getName()+ 其上面的註解為:
+an.annotationType().getSimpleName());
Method[] meths =an.annotationType().getDeclaredMethods();
// 遍歷每個註解的所有變數
for(Method meth :meths) {
System.out.println(註解的變數名為: + meth.getName 注釋有三種:// /* */ /** */ 前兩種編譯器直接跳過,從來不閱讀,第三種編譯器是可以看懂的,當你使用javadoc這樣的命令時會用到,用來生成API時用的。
註解:這東東完全就是給編譯器看的。 比如@Ovrride表示這個方法是重寫了父類中的方法,而不是自定義的,所以這個時候編譯器會去檢查你的方法名是否和父類一樣,是否寫錯了。
以上是不同的概念
C. java源代碼編譯的時候怎麼處理注釋部分的
所謂的編譯就是把高級的語言翻譯成計算機可以識別的機器語言,所以當編譯程序編譯到注釋那段的時候程序也會把它編譯成機器碼的形似存儲在內存里,但是這個機器碼並不會執行,如果你學過匯編你就會知道它們的存儲空間是不一樣的
D. 如何實現自定義Java編譯時註解功能
自定義註解,可以應用到反射中,比如自己寫個小框架。
如實現實體類某些屬性不自動賦值,或者驗證某個對象屬性完整性等
本人自己用過的驗證屬性值完整性:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface IgnoreProperty {
}
然後實體類中:
public class TarResearch implements Serializable{
@IgnoreProperty
private static final long serialVersionUID = 1L;
@IgnoreProperty
private Integer researchId;
@IgnoreProperty
private TarUser userId;
private String version;
private String grade;
....
}
然後action類中
// 驗證數據完整性
Class<TarResearch > userClass = TarResearch .class;
Field[] field = userClass.getDeclaredFields();
for (int i = 0; i < field.length; i++) {
if (field[i].getAnnotation(IgnoreProperty.class) != null) {
continue;
}
String fie = field[i].getName().substring(0, 1).toUpperCase()
+ field[i].getName().substring(1);
Method method = userClass.getMethod("get" + fie);
Object obj = method.invoke(u);
if (obj == null) {
sendResponseMsg(response, "數據錯誤");
return null;
}
}
E. Java class文件反編譯中的注釋有什麼作用
注釋的內容是java位元組碼,注釋掉是為了防止IDE等工具報語法錯誤。
出現這個現象的原因是反編譯失敗了,也就是說反編譯不出該方法的源碼,為了不讓用戶誤認為這是個空方法,直接將位元組碼顯示出來是個好主意,但是直接將位元組碼顯示出來,IDE等工具是會報語法錯誤的,這時候以注釋的形式來表現我覺得是最好的方式。
F. Java使用注釋編譯錯誤
javac HelloWorld.java
java HelloWorld
G. java編譯時,注釋是否編譯
注釋有注釋//和/*....*/,還有一種注釋/**.....,前兩種並不被編譯,但後一種用javadoc命令可以寫進文檔中!!!!!!
H. Java 什麼是註解及註解原理詳細介紹
1、註解是針對Java編譯器的說明。
可以給Java包、類型(類、介面、枚舉)、構造器、方法、域、參數和局部變數進行註解。Java編譯器可以根據指令來解釋註解和放棄註解,或者將註解放到編譯後的生成的class文件中,運行時可用。
2、註解和註解類型
註解類型是一種特殊的介面類型,註解是註解註解類型的一個實例。
註解類型也有名稱和成員,註解中包含的信息採用鍵值對形式,可以有0個或多個。
3、Java中定義的一些註解:
@Override 告訴編譯器這個方法要覆蓋一個超類方法,防止程序員覆蓋出錯。
@Deprecated 這個標識方法或類(介面等類型)過期,警告用戶不建議使用。
@SafeVarargs JDK7新增,避免可變參數在使用泛型化時候警告」執行時期無法具體確認參數類型「,當然,也可以用@SuppressWarnings來避免檢查,顯然後者的抑制的范圍更大。
@SuppressWarnings(value={"unchecked"}) 抑制編譯警告,應用於類型、構造器、方法、域、參數以及局部變數。 value是類型數組,有效取值為:
all, to suppress all warnings
boxing, to suppress warnings relative to boxing/unboxing operations
cast, to suppress warnings relative to cast operations
dep-ann, to suppress warnings relative to deprecated annotation
deprecation, to suppress warnings relative to deprecation
fallthrough, to suppress warnings relative to missing breaks in switch statements
finally, to suppress warnings relative to finally block that don't return
hiding, to suppress warnings relative to locals that hide variable
incomplete-switch, to suppress warnings relative to missing entries in a switch statement (enum case)
javadoc, to suppress warnings relative to javadoc warnings
nls, to suppress warnings relative to non-nls string literals
null, to suppress warnings relative to null analysis
rawtypes, to suppress warnings relative to usage of raw types
restriction, to suppress warnings relative to usage of discouraged or forbidden references
serial, to suppress warnings relative to missing serialVersionUID field for a serializable class
static-access, to suppress warnings relative to incorrect static access
static-method, to suppress warnings relative to methods that could be declared as static
super, to suppress warnings relative to overriding a method without super invocations
synthetic-access, to suppress warnings relative to unoptimized access from inner classes
unchecked, to suppress warnings relative to unchecked operations
unqualified-field-access, to suppress warnings relative to field access unqualified
unused, to suppress warnings relative to unused code and dead code
4、註解的定義
使用 @interface 關鍵字聲明一個註解
public @interface MyAnnotation1
註解中可以定義屬性
String name default 「defval」;
value是註解中的特殊屬性
註解中定義的屬性如果名稱為 value, 此屬性在使用時可以省寫屬性名
例如,聲明一個註解:
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno1 {
String msg();
int value();
}
I. Java編譯時註解和運行時註解有什麼區別
重寫,重載,泛型,分別是在運行時還是編譯時執行的
1. 方法重載是在編譯時執行的,因為,在編譯的時候,如果調用了一個重載的方法,那麼編譯時必須確定他調用的方法是哪個。如:
當調用evaluate("hello")時候,我們在編譯時就可以確定他調用的method #1.
2.
方法的重寫是在運行時進行的。這個也常被稱為運行時多態的體現。編譯器是沒有辦法知道它調用的到底是那個方法,相反的,只有在jvm執行過程中,才知曉到底是父子類中的哪個方法被調用了當有如下一個介面的時候,我們是無法確定到底是調用父類還是子類的方法
3.
泛型(類型檢測),這個發生在編譯時。編譯器會在編譯時對泛型類型進行檢測,並吧他重寫成實際的對象類型(非泛型代碼),這樣就可以被JVM執行了。這個過程被稱為"類型擦除"。
類型擦除的關鍵在於從泛型類型中清除類型參數的相關信息,並且再必要的時候添加類型檢查和類型轉換的方法。
類型擦除可以簡單的理解為將泛型java代碼轉換為普通java代碼,只不過編譯器更直接點,將泛型java代碼直接轉換成普通java位元組碼。類型擦除的主要過程如下:
1). 將所有的泛型參數用其最左邊界(最頂級的父類型)類型替換。
2). 移除所有的類型參數。
在編譯後變成:
4. 註解。註解即有可能是運行時也有可能是編譯時。
如java中的@Override註解就是典型的編譯時註解,他會在編譯時會檢查一些簡單的如拼寫的錯誤(與父類方法不相同)等
同樣的@Test註解是junit框架的註解,他是一個運行時註解,他可以在運行時動態的配置相關信息如timeout等。
5. 異常。異常即有可能是運行時異常,也有可能是編譯時異常。
RuntimeException是一個用於指示編譯器不需要檢查的異常。RuntimeException
是在jvm運行過程中拋出異常的父類。對於運行時異常是不需要再方法中顯示的捕獲或者處理的。
已檢查的異常是被編譯器在編譯時候已經檢查過的異常,這些異常需要在try/catch塊中處理的異常。
6. AOP. Aspects能夠在編譯時,預編譯時以及運行時使用。
1).
編譯時:當你擁有源碼的時候,AOP編譯器(AspectJ編譯器)能夠編譯源碼並生成編織後的class。這些編織進入的額外功能是在編譯時放進去的。
2). 預編譯時:織入過程有時候也叫二進制織入,它是用來織入到哪些已經存在的class文件或者jar中的。
3). 運行時:當被織入的對象已經被載入如jvm中後,可以動態的織入到這些類中一些信息。
7. 繼承:繼承是編譯時執行的,它是靜態的。這個過程編譯後就已經確定
8. 代理(delegate):也稱動態代理,是在運行時執行。