『壹』 推薦幾本javaEE的書籍,經典的。不要李剛的(雖然講的好,但是繁瑣,基礎東西太多了)。結合了三大框架的
[Spring.2.0核心技術和最佳實踐。廖學鋒掃描版。
容易的Hibernate「PDF清晰版。PDF
精通struts的基於MVC的設計與開發PDF
[Struts.2權威指南 - 基於MVC開發的WebWork的核心。鋼。Java.web掃描版PDF
Java方面的內部電驢學習知識
:
遞歸集合J2SE面向對象 - 封裝,繼承,多態
內存分析,通用,自動裝箱和拆箱,注釋
IO
多線程,線程同步
TCP / UDP
AWT,事件模型,匿名類
反射機制
SQL語句
多表聯接的資料庫(Oracle或MySQL)的正則表達式,內部和外部連接,子查詢
管理表,視圖,索引,序列,約束樹的存儲
存儲過程,觸發器
資料庫設計三大範式,
3:JDBC
JDBC基本/>連接池
樹的存儲和顯示
數據源的RowSet
JDBC連接Oracle和MySQL
:HTML_CSS_JAVASCRIPT
HTML,CSS,JavaScript的基本語法
> JavaScript的形成判斷
DOM編程基礎(事件處理程序)
JS效果,如TreeView,下拉聯動JS學習方法
JS調試方法
DreamWeaver的初步(創建HTML,表格,表單,CSS)
5:Servlet的基礎JSP
Tomcat的
servlet的基礎的
web.xml中的配置基本
Web應用程序結構
servlet的生命周期
請求的響應常用的方法
的ServletContext類
HTTP協議基礎(GET,POST)
餅干會話
應用程序
幾個語法(JSP,包括JSTL)注意練習的項目,而不是堅持的語法和包裝步驟的細節之前。
6:Struts的
多層體系結構的理論
模式1和模式2
Struts的
MVC
操作的業務邏輯類的基本概念之間的關系
Struts和JSP之間傳遞數據的
的Struts的治療過程(流量控制)
的Struts的TagLib(了解常用的)
JSTL
中的ActionForm
>欄位集合
上傳文件的類型轉換
DTO
動力作用形成的
驗證框架
的ActionForward轉發和重定向
動態生成的ActionForward
全局和局部的ActionForward
行動的推進范圍
UnknownActionMapping
行動線程安全
I18N
如何切換語言環境的
Struts的異常處理機制處理
用戶自定義的異常處理程序
Struts的多模塊配置7:XML
(XML / XSL,XSLT / DTD的,SCHEMA基本的Java編程的概念可以自動處理暫且不說)
8:休眠 OR映射
Hibernate的基本發展原則,步驟
休眠
基本介面(重點屆)
常見的屬性的映射關系映射
原生SQL
懶級聯反
繼承關系映射
HQL
性能優化緩存二級緩存查詢緩存
事務並發悲觀鎖定,樂觀鎖定
OpenSessionInView
CurrentSession
(至於JTA,的聯合主鍵的自然主鍵動態主鍵的任何類型Creteria查詢截擊和事件自定義類型,等等。 ,你可以暫時扔到一邊)
9:春季
IOC / DI
Spring配置
春季建築
AOP和Spring AOP
聲明式事務(AOP )
Spring + Hibernate的春天的Web
范圍
(其他的Spring模塊,你可以暫時扔到一邊自學)
10:EJB3.0
J2EE架構基金會(JTA JMS)
EJB基礎(地位及基本理論,分類等)
注釋
Ant的編譯和部署EJB
會話Bean的
EJB依賴注入
持久性API
(JBoss的學習EJB3.0)
11:SOA
30個進球
你需要精通面向對象分析與設計(OOA / OOD),涉及模式(GOF,J2EEDP),以及綜合模式。你應該充分了解UML,尤其是類,對象,互動,和statediagrams。<BR / 2,你需要學習JAVA語言以及它的核心類庫集合,序列化,流,網路,多線程,反射,事件處理,NIO,定製系統的本地化,以及其他的基本知識。
3類載入器,JVM,classreflect,以及垃圾回收的基本工作機制,您應該是知道的,你應該有能力反編譯一個類文件並且明白一些基本的匯編指令。
如果你要寫一個客戶端程序,你需要學習WEB的小應用程序(applet),必需掌握GUI設計的思想和方法的,和桌面應用程序的SWING,AWT,SWT,你也明白的UI部件的JAVABEAN組件模式中。JAVABEANS適用於業務邏輯的分離表示層JSP。
5。需要學習java資料庫技術,如JDBCAPI,會使用至少一種persistence / ORM構架,比如Hibernate,JDO,CocoBase,TopLink的InsideLiberator(國產JDO紅工廠軟體)或者iBatis。
6。您還應該了解對象關系的阻抗失配的含義,以及它是如何影響業務對象的與關系型資料庫交互,和結果它的操作,但還需要掌握不同的資料庫產品,如拉克勒,MySQL和MSSQLSERVER。
7。你需要學習JAVA的沙盒安全模式(類載入器,bytecodeverification,的經理,policyandpermissions,
代碼簽名,加密技術,認證,Kerberos身份,和其他人)digitalsignatures,以及不同的安全/認證API的JAAS()的,JCE(JavaCryptographyExtension)的的JSSE(JavaSecureSocketExtension)以及JGSS(JavaGeneralSecurityService)。
8。你需要學習Servlets和JSP,以及的JSTL(StandardTagLibraries)和選定的第三方TagLibraries。
9。你需要熟悉主流的網頁框架,例如JSF,Struts中,掛毯,蠶繭,WebWork中,和他們下面的涉及模式,如MVC/MODEL2。
10。你需要學習如何使用及管理WEB伺服器,例如tomcat的,樹脂的JRUN,並知道如何的基礎上擴展和維護WEB程序。
11。你需要學習分布式對象和遠程API,例如RMI和RMI / IIOP。
12。你需要掌握各種流行中間件技術標准,並結合java實現,比如Tuxedo,CROBA,當然也包括JavaEE的本身。你應該學會
你需要學習至少一個XMLAPI例如JAXP(JavaAPIforXMLProcessing)的JDOM(JavaforXMLDocumentObjectModel),DOM4J,或JAXR(JavaAPIforXMLRegistries)。
14。如何利用JAVAAPI和工具來構建WebService的。(JavaAPIforXML / RPC),JAX-RPC SAAJ的(SOAPwithAttachmentsAPIforJava)的,JAXB(JavaArchitectureforXMLBinding)JAXM(JavaAPIforXMLMessaging)的JAXR(JavaAPIforXMLRegistries),或JWSDP(JavaWebServicesDeveloperPack)的。
> 15。需要,學習一個輕量級應用程序框架,例如Spring中,PicoContainer的阿瓦隆,以及他們的IoC / DI風格(setter方法??,構造函數,集成*** ceinjection)。
16。你需要熟悉不同的J2EE技術??,例如JNDI(JavaNamingandDirectoryInte *** CE)的JMS(JavaMessageService)的,JTA / JTS(JavaTransactionAPI / JavaTransactionService)的JMX(JavaManagementeXtensions),以及JavaMail的。
17。企業類級JavaBeans(EJB),你需要學習以及它們的不同組件模式:無狀態/ StatefulSessionBeans,EntityBeans(bean-ManagedPersistence的包含[BMP]或容器ManagedPersistence [CMP]和它的EJB-QL),或者消息DrivenBeans(MDB )
18。你需要學習如何管理與配置一個J2EE應用程序伺服器,如WebLogic,JBoss的,並利用它的附加服務,例如簇類,連接池以及分布式處理的支持。您還需要了解它是如何封裝和配置應用程序能夠監控,調整它的性能。
19。你需要熟悉面向方面的編程,以及面向屬性的程序設計(兩個很容易混淆縮寫為AOP),以及他們的主流JAVA規格和執行。如AspectJ和AspectWerkz。
20。熟悉的服務不同有用的API和框架為你工作。例如,Log4J的(記錄/跟蹤),石英(調度)的JGroups(networkgroupcommunication)JCache(distributedcaching)的,Lucene的(全職文章搜索)JakartaCommons的。
21。如果你要對接和舊的系統或本地平台,你需要學習的JNI(JavaNativeInte *** CE)和JCA(JavaConnectorArchitecture)。
22。JINI技術,您需要熟悉,和它的分布式系統,如主CROBA。
23。你需要JavaCommunityProcess的( JCP),和他的不同JavaSpecificationRequests(JSR的),如JOLAP的Portlets(168)(69)(73),DataMiningAPI,等等。
24。你應該熟悉與的一個JAVAIDE例子的SunOne的NetBeans IntelliJIDEA或Eclipse(有些人更喜歡VI或EMACS來編寫文件不管你是什麼:)
25.JAVA一些配置(精確)是冗長的,它需要很多的人工代碼(例如EJB),所以你需要熟悉代碼生成工具,例如XDoclet。
26。你需要熟悉單元測試體系(JNunit),並且學習不同的生成,部署工具(Ant,Maven的)。
27。你需要熟悉JAVA開發的,經常使用的軟體工程過程。例如RUP(RationalUnifiedProcess)andAgilemethodologies的。
28。你需要深入了解加熟練操作和配置操作系統,比如GNU / Linux操作系統,sunsolaris MacOS的,作為一個跨平台的軟體開發。
29。您還需要跟上Java的發展步伐,比如現在可以深入學習javaME的,以及各種java中,使用的技術,如啟動一個新的web富客戶端技術的新規范。
30。您需要了解開源,至少在,許多Java技術的直接依賴開放源碼,以推動發展,如JAVA3D技術。
『貳』 java中的native關鍵字有什麼作用
以下分三點來講述一下java native:
1、什麼是Native Method
簡單地講,一個Native Method就是一個java調用非java代碼的介面。一個Native Method是這樣一個java的方法:該方法的實現由非java語言實現,比如C。這個特徵並非java所特有,很多其它的編程語言都有這一機制,比如在C++中,你可以用extern "C"告知C++編譯器去調用一個C的函數。
"A native method is a Java method whose implementation is provided by non-java code."
在定義一個native method時,並不提供實現體(有些像定義一個java interface),因為其實現體是由非java語言在外面實現的。,下面給了一個示例:
public class IHaveNatives
{
native public void Native1( int x ) ;
native static public long Native2() ;
native synchronized private float Native3( Object o ) ;
native void Native4( int[] ary ) throws Exception ;
}
這些方法的聲明描述了一些非java代碼在這些java代碼里看起來像什麼樣子(view).
標識符native可以與所有其它的java標識符連用,但是abstract除外。這是合理的,因為native暗示這些方法是有實現體的,只不過這些實現體是非java的,但是abstract卻顯然的指明這些方法無實現體。native與其它java標識符連用時,其意義同非Native Method並無差別,比如native static表明這個方法可以在不產生類的實例時直接調用,這非常方便,比如當你想用一個native method去調用一個C的類庫時。上面的第三個方法用到了native synchronized,JVM在進入這個方法的實現體之前會執行同步鎖機制(就像java的多線程。)
一個native method方法可以返回任何java類型,包括非基本類型,而且同樣可以進行異常控制。這些方法的實現體可以制一個異常並且將其拋出,這一點與java的方法非常相似。當一個native method接收到一些非基本類型時如Object或一個整型數組時,這個方法可以訪問這非些基本型的內部,但是這將使這個native方法依賴於你所訪問的java類的實現。有一點要牢牢記住:我們可以在一個native method的本地實現中訪問所有的java特性,但是這要依賴於你所訪問的java特性的實現,而且這樣做遠遠不如在java語言中使用那些特性方便和容易。
native method的存在並不會對其他類調用這些本地方法產生任何影響,實際上調用這些方法的其他類甚至不知道它所調用的是一個本地方法。JVM將控制調用本地方法的所有細節。需要注意當我們將一個本地方法聲明為final的情況。用java實現的方法體在被編譯時可能會因為內聯而產生效率上的提升。但是一個native final方法是否也能獲得這樣的好處卻是值得懷疑的,但是這只是一個代碼優化方面的問題,對功能實現沒有影響。
如果一個含有本地方法的類被繼承,子類會繼承這個本地方法並且可以用java語言重寫這個方法(這個似乎看起來有些奇怪),同樣的如果一個本地方法被fianl標識,它被繼承後不能被重寫。
本地方法非常有用,因為它有效地擴充了jvm.事實上,我們所寫的java代碼已經用到了本地方法,在sun的java的並發(多線程)的機制實現中,許多與操作系統的接觸點都用到了本地方法,這使得java程序能夠超越java運行時的界限。有了本地方法,java程序可以做任何應用層次的任務。
2、為什麼要使用Native Method
java使用起來非常方便,然而有些層次的任務用java實現起來不容易,或者我們對程序的效率很在意時,問題就來了。
與java環境外交互:
有時java應用需要與java外面的環境交互。這是本地方法存在的主要原因,你可以想想java需要與一些底層系統如操作系統或某些硬體交換信息時的情況。本地方法正是這樣一種交流機制:它為我們提供了一個非常簡潔的介面,而且我們無需去了解java應用之外的繁瑣的細節。
與操作系統交互:
JVM支持著java語言本身和運行時庫,它是java程序賴以生存的平台,它由一個解釋器(解釋位元組碼)和一些連接到本地代碼的庫組成。然而不管怎 樣,它畢竟不是一個完整的系統,它經常依賴於一些底層(underneath在下面的)系統的支持。這些底層系統常常是強大的操作系統。通過使用本地方法,我們得以用java實現了jre的與底層系統的交互,甚至JVM的一些部分就是用C寫的,還有,如果我們要使用一些java語言本身沒有提供封裝的操作系統的特性時,我們也需要使用本地方法。
Sun's Java
Sun的解釋器是用C實現的,這使得它能像一些普通的C一樣與外部交互。jre大部分是用java實現的,它也通過一些本地方法與外界交互。例如:類java.lang.Thread 的 setPriority()方法是用java實現的,但是它實現調用的是該類里的本地方法setPriority0()。這個本地方法是用C實現的,並被植入JVM內部,在Windows 95的平台上,這個本地方法最終將調用Win32 SetPriority() API。這是一個本地方法的具體實現由JVM直接提供,更多的情況是本地方法由外部的動態鏈接庫(external dynamic link library)提供,然後被JVM調用。
3、JVM怎樣使Native Method跑起來:
我們知道,當一個類第一次被使用到時,這個類的位元組碼會被載入到內存,並且只會回載一次。在這個被載入的位元組碼的入口維持著一個該類所有方法描述符的list,這些方法描述符包含這樣一些信息:方法代碼存於何處,它有哪些參數,方法的描述符(public之類)等等。
如果一個方法描述符內有native,這個描述符塊將有一個指向該方法的實現的指針。這些實現在一些DLL文件內,但是它們會被操作系統載入到java程序的地址空間。當一個帶有本地方法的類被載入時,其相關的DLL並未被載入,因此指向方法實現的指針並不會被設置。當本地方法被調用之前,這些DLL才會被載入,這是通過調用java.system.loadLibrary()實現的。
最後需要提示的是,使用本地方法是有開銷的,它喪失了java的很多好處。如果別無選擇,我們可以選擇使用本地方法。
『叄』 一種通用超簡單的Android Java Native方法Hook,無需依賴Hook框架
前言
目前,Android平台上的Hook框架數量眾多,但專門針對Java Native方法的Hook卻相對較少。這些框架通常將native方法視為普通方法進行Hook,並且可能需要適配復雜的架構差異。本文將介紹一種通用的Android版本Java Native方法Hook方法,實現代碼精簡,旨在解決這一問題。
native方法注冊
在Android中,native方法有兩種注冊方式。本文將通過分析這兩種方式,提出相應的Hook方法。
RegisterNatives源碼分析
RegisterNatives方法主要進行各種驗證並查找對應的方法ArtMethod。對於FastNative,該功能在Android 8.0之後通過註解實現,最終通過class_linker->RegisterNative(soa.Self(), m, fnPtr)完成函數注冊。接著,我們分析JVMTI的用法,它允許實現許多高級功能,包括修改後的new_native_method。通過JVMTI,我們可以實現Hook功能。對於CriticalNative,如果類未初始化,則先初始化類,然後注冊方法。最終實現注冊的是method->SetEntryPointFromJni(new_native_method)。
在Android 11及以下版本中,直接調用ArtMethod::RegisterNative方法即可覆蓋原有功能。對於Android 9以下版本,需要清理FastNative標志。
分析過程較為復雜,今天僅分享一部分內容,文中語言表述可能不夠流暢,對於有興趣深入了解的朋友,可以與我私下探討。
示例代碼:
p
unit ClientFrm;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, CoolTrayIcon, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, ExtCtrls, Menus;
type
TClientForm = class(TForm)
PopupMenu1: TPopupMenu;
N1: TMenuItem;
procere N1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
ClientForm: TClientForm;
implementation
{$R *.dfm}
procere TClientForm.N1Click(Sender: TObject);
begin
close
end;
end.
p
unit BuyFrm;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
type
TBuyForm = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
BuyForm: TBuyForm;
implementation
{$R *.dfm}
end.
p
unit IECache Demo ver 1.01 (2006) *
// For Delphi 5 - 2009
// Freeware Demo
// by
// Per Linds?Larsen
// Contributions:
// Eran Bodankin - bsalsa( [email protected])
// Updated versions:
// bsalsa.com
//*************************************************************************
// LICENSE:
// THIS SOFTWARE IS PROVIDED TO YOU "AS IS" WITHOUT WARRANTY OF ANY KIND,
// EITHER EXPRESSED OR IMPLIED INCLUDING BUT NOT LIMITED TO THE APPLIED
// WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
// YOU ASSUME THE ENTIRE RISK AS TO THE ACCURACY AND THE USE OF THE SOFTWARE
// AND ALL OTHER RISK ARISING OUT OF THE USE OR PERFORMANCE OF THIS SOFTWARE
// AND DOCUMENTATION. [YOUR NAME] DOES NOT WARRANT THAT THE SOFTWARE IS ERROR-FREE
// OR WILL OPERATE WITHOUT INTERRUPTION. THE SOFTWARE IS NOT DESIGNED, INTENDED
// OR LICENSED FOR USE IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE CONTROLS,
// INCLUDING WITHOUT LIMITATION, THE DESIGN, CONSTRUCTION, MAINTENANCE OR
// OPERATION OF NUCLEAR FACILITIES, AIRCRAFT NAVIGATION OR COMMUNICATION SYSTEMS,
// AIR TRAFFIC CONTROL, AND LIFE SUPPORT OR WEAPONS SYSTEMS. VSOFT SPECIFICALLY
// DISMISSES ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR SUCH PURPOSE.
// You may use, change or modify the component under 3 conditions:
// 1. In your website, add a link to " bsalsa.com"
// 2. In your application, add credits to "Embedded Web Browser"
// 3. Mail me ( [email protected]) any code change in the unit
// for the benefit of the other users.
// 4. Please, consider donation in our web site!
// {*******************************************************************************}
unit cachedemo_u;
interface
uses
wininet, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, IECache, StdCtrls, ExtCtrls, OleCtrls, SHDocVw_EWB, EmbeddedWB, EwbCore;
type
TForm1 = class(TForm)
ListBox1: TListBox;
RadioGroup1: TRadioGroup;
Button2: TButton;
Button1: TButton;
IECache1: TIECache;
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Button3: TButton;
OpenDlg: TOpenDialog;
CheckBox1: TCheckBox;
DeleteEntryBtn: TButton;
Panel1: TPanel;
EmbeddedWB1: TEmbeddedWB;
『肆』 java什麼情況下用native方法
Java不是完美的,Java的不足除了體現在運行速度上要比傳統的C++慢許多之外,Java無法直接訪問內到操作系統底層(如容系統硬體等),為此Java使用native方法來擴展Java程序的功能。
可以將native方法比作Java程序同C程序的介面,其實現步驟:
1、在Java中聲明native()方法,然後編譯。
2、用javah產生一個.h文件。
3、寫一個.cpp文件實現native導出方法,其中需要包含第二步產生的.h文件(注意其中又包含了JDK帶的jni.h文件)。
4、將第三步的.cpp文件編譯成動態鏈接庫文件。
5、在Java中用System.loadLibrary()方法載入第四步產生的動態鏈接庫文件,這個native()方法就可以在Java中被訪問了。
JAVA的native方法適用的情況:
1、為了使用底層的主機平台的某個特性,而這個特性不能通過JAVA API訪問。
2、為了訪問一個老的系統或者使用一個已有的庫,而這個系統或這個庫不是用JAVA編寫的。
3、為了加快程序的性能,而將一段時間敏感的代碼作為本地方法實現。
『伍』 、abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized
abstract的method 不可以是static的,因為抽象的方法是要被子類實現的,而static與子類扯不上關系!
native方法表示該方法要用另外一種依賴平台的編程語言實現的,不存在著被子類實現的問題,所以,它也不能是抽象的,不能與abstract混用。例如,FileOutputSteam類要硬體打交道,底層的實現用的是操作系統相關的api實現,例如,在windows用c語言實現的,所以,查看jdk 的源代碼,可以發現FileOutputStream的open方法的定義如下:
private native void open(String name) throws FileNotFoundException;
如果我們要用java調用別人寫的c語言函數,我們是無法直接調用的,我們需要按照java的要求寫一個c語言的函數,又我們的這個c語言函數去調用別人的c語言函數。由於我們的c語言函數是按java的要求來寫的,我們這個c語言函數就可以與java對接上,java那邊的對接方式就是定義出與我們這個c函數相對應的方法,java中對應的方法不需要寫具體的代碼,但需要在前面聲明native。
關於synchronized與abstract合用的問題,我覺得也不行,因為在我幾年的學習和開發中,從來沒見到過這種情況,並且我覺得synchronized應該是作用在一個具體的方法上才有意義。而且,方法上的synchronized同步所使用的同步鎖對象是this,而抽象方法上無法確定this是什麼。