### 1.Desktop類和SystemTray類
在JDK6中 ,AWT新增加了兩個類:Desktop和SystemTray。
前者可以用來打開系統默認瀏覽器瀏覽指定的URL,打開系統默認郵件客戶端給指定的郵箱發郵件,用默認應用程序打開或編輯文件\(比如,用記事本打開以txt為后綴名的文件\),用系統默認的打印機打印文檔;后者可以用來在系統托盤區創建一個托盤程序;
### 2.使用JAXB2來實現對象與XML之間的映射
JAXB是Java Architecture for XML Binding的縮寫,可以將一個Java對象轉變成為XML格式,反之亦然。
我 們把對象與關系數據庫之間的映射稱為ORM, 其實也可以把對象與XML之間的映射稱為OXM\(Object XML Mapping\). 原來JAXB是Java EE的一部分,在JDK6中,SUN將其放到了Java SE中,這也是SUN的一貫做法。JDK6中自帶的這個JAXB版本是2.0, 比起1.0\(JSR 31\)來,JAXB2\(JSR 222\)用JDK5的新特性Annotation來標識要作綁定的類和屬性等,這就極大簡化了開發的工作量。
實 際上,在Java EE 5.0中,EJB和Web Services也通過Annotation來簡化開發工作。另外,JAXB2在底層是用StAX\(JSR 173\)來處理XML文檔。除了JAXB之外,我們還可以通過XMLBeans和Castor等來實現同樣的功能。
### 3.理解StAX
StAX\(JSR 173\)是JDK6.0中除了DOM和SAX之外的又一種處理XML文檔的API。
StAX 的來歷 :在JAXP1.3\(JSR 206\)有兩種處理XML文檔的方法:DOM\(Document Object Model\)和SAX\(Simple API for XML\).
由 于JDK6.0中的JAXB2\(JSR 222\)和JAX-WS 2.0\(JSR 224\)都會用到StAX,所以Sun決定把StAX加入到JAXP家族當中來,并將JAXP的版本升級到1.4\(JAXP1.4是JAXP1.3的維護版本\). JDK6里面JAXP的版本就是1.4. 。
StAX是The Streaming API for XML的縮寫,一種利用拉模式解析\(pull-parsing\)XML文檔的API.StAX通過提供一種基于事件迭代器\(Iterator\)的API讓 程序員去控制xml文檔解析過程,程序遍歷這個事件迭代器去處理每一個解析事件,解析事件可以看做是程序拉出來的,也就是程序促使解析器產生一個解析事件,然后處理該事件,之后又促使解析器產生下一個解析事件,如此循環直到碰到文檔結束符;
SAX也是基于事件處理xml文檔,但卻是用推模式解析,解析器解析完整個xml文檔后,才產生解析事件,然后推給程序去處理這些事件;DOM 采用的方式是將整個xml文檔映射到一顆內存樹,這樣就可以很容易地得到父節點和子結點以及兄弟節點的數據,但如果文檔很大,將會嚴重影響性能。
### 4.使用Compiler API
現在我們可以用JDK6 的Compiler API\(JSR 199\)去動態編譯Java源文件,Compiler API結合反射功能就可以實現動態的產生Java代碼并編譯執行這些代碼,有點動態語言的特征。
這個特性對于某些需要用到動態編譯的應用程序相當有用,比如JSP Web Server,當我們手動修改JSP后,是不希望需要重啟Web Server才可以看到效果的,這時候我們就可以用Compiler API來實現動態編譯JSP文件,當然,現在的JSP Web Server也是支持JSP熱部署的,現在的JSP Web Server通過在運行期間通過Runtime.exec或ProcessBuilder來調用javac來編譯代碼,這種方式需要我們產生另一個進程去 做編譯工作,不夠優雅而且容易使代碼依賴與特定的操作系統;Compiler API通過一套易用的標準的API提供了更加豐富的方式去做動態編譯,而且是跨平臺的。
### 5.輕量級Http Server API
JDK6 提供了一個簡單的Http Server API,據此我們可以構建自己的嵌入式Http Server,它支持Http和Https協議,提供了HTTP1.1的部分實現,沒有被實現的那部分可以通過擴展已有的Http Server API來實現,程序員必須自己實現HttpHandler接口,HttpServer會調用HttpHandler實現類的回調方法來處理客戶端請求,在 這里,我們把一個Http請求和它的響應稱為一個交換,包裝成HttpExchange類,HttpServer負責將HttpExchange傳給 HttpHandler實現類的回調方法
### 6.插入式注解處理API\(Pluggable Annotation Processing API\)
插入式注解處理API\(JSR 269\)提供一套標準API來處理Annotations\(JSR 175\)
實 際上JSR 269不僅僅用來處理Annotation,我覺得更強大的功能是它建立了Java 語言本身的一個模型,它把method, package, constructor, type, variable, enum, annotation等Java語言元素映射為Types和Elements\(兩者有什么區別?\), 從而將Java語言的語義映射成為對象, 我們可以在javax.lang.model包下面可以看到這些類. 所以我們可以利用JSR 269提供的API來構建一個功能豐富的元編程\(metaprogramming\)環境.
JSR 269用Annotation Processor在編譯期間而不是運行期間處理Annotation, Annotation Processor相當于編譯器的一個插件,所以稱為插入式注解處理.如果Annotation Processor處理Annotation時\(執行process方法\)產生了新的Java代碼,編譯器會再調用一次Annotation Processor,如果第二次處理還有新代碼產生,就會接著調用Annotation Processor,直到沒有新代碼產生為止.每執行一次process\(\)方法被稱為一個"round",這樣整個Annotation processing過程可以看作是一個round的序列.
JSR 269主要被設計成為針對Tools或者容器的API. 舉個例子,我們想建立一套基于Annotation的單元測試框架\(如TestNG\),在測試類里面用Annotation來標識測試期間需要執行的測試方法。
### 7.用Console開發控制臺程序
JDK6 中提供了java.io.Console 類專用來訪問基于字符的控制臺設備. 你的程序如果要與Windows下的cmd或者Linux下的Terminal交互,就可以用Console類代勞. 但我們不總是能得到可用的Console, 一個JVM是否有可用的Console依賴于底層平臺和JVM如何被調用. 如果JVM是在交互式命令行\(比如Windows的cmd\)中啟動的,并且輸入輸出沒有重定向到另外的地方,那么就可以得到一個可用的Console實例
### 8.對腳本語言的支持如: ruby, groovy, javascript
### 9.Common Annotations
Common annotations原本是Java EE 5.0\(JSR 244\)規范的一部分,現在SUN把它的一部分放到了Java SE 6.0中.
隨著Annotation元數據功能\(JSR 175\)加入到Java SE 5.0里面,很多Java 技術\(比如EJB,Web Services\)都會用Annotation部分代替XML文件來配置運行參數(或者說是支持聲明式編程,如EJB的聲明式事務), 如果這些技術為通用目的都單獨定義了自己的Annotations,顯然有點重復建設, 所以,為其他相關的Java技術定義一套公共的Annotation是有價值的,可以避免重復建設的同時,也保證Java SE和Java EE 各種技術的一致性.
下面列舉出Common Annotations 1.0里面的10個Annotations Common Annotations
Annotation Retention Target Description
Generated Source ANNOTATION\_TYPE, CONSTRUCTOR, FIELD, LOCAL\_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE 用于標注生成的源代碼
Resource Runtime TYPE, METHOD, FIELD 用于標注所依賴的資源,容器據此注入外部資源依賴,有基于字段的注入和基于setter方法的注入兩種方式
Resources Runtime TYPE 同時標注多個外部依賴,容器會把所有這些外部依賴注入
PostConstruct Runtime METHOD 標注當容器注入所有依賴之后運行的方法,用來進行依賴注入后的初始化工作,只有一個方法可以標注為PostConstruct
PreDestroy Runtime METHOD 當對象實例將要被從容器當中刪掉之前,要執行的回調方法要標注為PreDestroy RunAs Runtime TYPE 用于標注用什么安全角色來執行被標注類的方法,這個安全角色必須和Container 的Security角色一致的。RolesAllowed Runtime TYPE, METHOD 用于標注允許執行被標注類或方法的安全角色,這個安全角色必須和Container 的Security角色一致的
PermitAll Runtime TYPE, METHOD 允許所有角色執行被標注的類或方法
DenyAll Runtime TYPE, METHOD 不允許任何角色執行被標注的類或方法,表明該類或方法不能在Java EE容器里面運行
DeclareRoles Runtime TYPE 用來定義可以被應用程序檢驗的安全角色,通常用isUserInRole來檢驗安全角色
**注意: **
1.RolesAllowed,PermitAll,DenyAll不能同時應用到一個類或方法上
2.標注在方法上的RolesAllowed,PermitAll,DenyAll會覆蓋標注在類上的RolesAllowed,PermitAll,DenyAll
3.RunAs,RolesAllowed,PermitAll,DenyAll和DeclareRoles還沒有加到Java SE 6.0上來
4.處理以上Annotations的工作是由Java EE容器來做, Java SE 6.0只是包含了上面表格的前五種Annotations的定義類,并沒有包含處理這些Annotations的引擎,這個工作可以由Pluggable Annotation Processing API\(JSR 269\)來做
改動的地方最大的就是java GUI界面的顯示了,JDK6.0(也就是JDK1.6)支持最新的windows vista系統的Windows Aero視窗效果,而JDK1.5不支持!!!你要在vista環境下編程的話最好裝jdk6.0,否則它總是換到windows basic視窗效果.
- java演變
- JDK各個版本的新特性
- JDK1.5新特性
- JDK1.6新特性
- JDK1.7新特性
- JDK1.8新特性
- JAVA基礎
- 面向對象特性
- 多態
- 方法重載
- 方法重寫
- class
- 常量
- 訪問修飾符
- 類加載路徑
- java-equals
- 局部類
- java-hashCode
- Java類初始化順序
- java-clone方法
- JAVA對象實例化的方法
- 基礎部分
- JAVA基礎特性
- JAVA關鍵字
- javabean
- static
- 日期相關
- final
- interface
- 函數式接口
- JAVA異常
- 異常屏蔽
- try-with-resource資源泄露
- JAVA引用
- WeakReference
- SoftReference
- PhantomReference
- 位運算符
- try-with-resource語法糖
- JDK冷知識
- JAVA包裝類
- JAVA基本類型與包裝類
- java.lang.Boolean
- java.lang.Integer
- java.lang.Byte
- java.lang.Short
- java.lang.Long
- java.lang.Float
- java.lang.Double
- java.lang.Character
- 日期相關
- TemporalAdjusters
- String
- 字符串常量池
- String拼接
- String編譯期優化
- StringBuilder&StringBuffer
- intern
- 注解
- java標準注解
- 內置注解
- 元注解
- 自定義注解
- 注解處理器
- JVM注解
- Java8 Annotation新特性
- 反射-Reflective
- Reflection
- Class
- Constructor
- Method
- javabean-property
- MethodHandles
- 泛型
- 類型擦除
- bridge-method
- Accessor&Mutator方法
- enum
- JAVA數組
- finalize方法
- JAR文件
- JAVA高級編程
- CORBA
- JMX
- SPI
- Java SPI使用約定
- ServiceLoader
- 實際應用
- IO
- 工具類
- JDK常用工具類
- Objects
- System
- Optional
- Throwable
- Collections
- Array
- Arrays
- System
- Unsafe
- Number
- ClassLoader
- Runtime
- Object
- Comparator
- VarHandle
- 數據結構
- 棧-Stack
- 隊列(Queue)
- Deque
- PriorityQueue
- BlockingQueue
- SynchronousQueue
- ArrayBlockingQueue
- LinkedBlockingQueue
- PriorityBlockingQueue
- ConcurrentLinkedQueue
- 列表
- 迭代器
- KV鍵值對數據類型
- HashMap
- TreeMap
- Hash沖突
- ConcurrentHashMap
- JDK1.7 ConcurrentHashMap結構
- jdk7&jdk8區別
- 集合
- Vector
- Stack
- HashSet
- TreeSet
- ArrayList
- LinkedList
- ArrayList && LinkedList相互轉換
- 線程安全的集合類
- 集合類遍歷性能
- 并發容器
- CopyOnWriteArrayList
- ConcurrentHashMap
- 同步容器
- BitMap
- BloomFilter
- SkipList
- 設計模式
- 設計模式六大原則
- 單例模式
- 代理模式
- 靜態代理
- 動態代理
- JDK動態代理
- cglib動態代理
- spring aop
- 策略模式
- SpringAOP策略模式的運用
- 生產者消費者模式
- 迭代器模式
- 函數式編程
- 方法引用
- 性能問題
- Lambda
- Lambda類型檢查
- Stream
- findFirst和findAny
- reduce
- 原始類型流特化
- 無限流
- 收集器
- 并行流
- AOP
- 靜態織入
- aspect
- aspect的定義
- AspectJ與SpringAOP
- 動態織入
- 靜態代理
- 動態代理
- JDK動態代理
- CGLib動態代理
- Spring AOP
- SpringAOP五種通知類型
- @Before
- @AfterReturning
- @AfterThrowing
- @After
- @Around
- Aspect優先級
- SpringAOP切點表達式
- within
- execution
- 嵌套調用
- 系統優化與重構
- 重疊構造器模式
- 工具類構造器優化
- 常見面試題
- new Object()到底占用幾個字節
- 訪問修飾符
- cloneable接口實現原理
- 異常分類以及處理機制
- wait和sleep的區別
- 數組在內存中如何分配
- 類加載為什么要使用雙親委派模式,有沒有什么場景是打破了這個模式
- 類的實例化順序
- 附錄
- JAVA術語
- FAQ
- 墨菲定律
- 康威定律
- 軟件設計原則
- 阿姆達爾定律
- 字節碼工具
- OSGI