java減小編譯後文件大小
『壹』 安全開發運維必備的Nginx代理Web伺服器性能優化與安全加固配置
為了更好的指導部署與測試藝術升系統nginx網站伺服器高性能同時下安全穩定運行,需要對nginx服務進行調優與加固;
本次進行Nginx服務調優加固主要從以下幾個部分:
本文檔僅供內部使用,禁止外傳,幫助研發人員,運維人員對系統長期穩定的運行提供技術文檔參考。
Nginx是一個高性能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP伺服器。Nginx作為負載均衡伺服器, Nginx 既可以在內部直接支持 Rails 和 PHP 程序對外進行服務,也可以支持作為 HTTP代理伺服器對外進行服務。
Nginx版本選擇:
項目結構:
Nginx文檔幫助: http://nginx.org/en/docs/
Nginx首頁地址目錄: /usr/share/nginx/html
Nginx配置文件:
localtion 請求匹配的url實是一個正則表達式:
Nginx 匹配判斷表達式:
例如,匹配末尾為如下後綴的靜態並判斷是否存在該文件, 如不存在則404。
查看可用模塊編譯參數:http://nginx.org/en/docs/configure.html
http_gzip模塊
開啟gzip壓縮輸出(常常是大於1kb的靜態文件),減少網路傳輸;
http_fastcgi_mole模塊
nginx可以用來請求路由到FastCGI伺服器運行應用程序由各種框架和PHP編程語言等。可以開啟FastCGI的緩存功能以及將靜態資源進行剝離,從而提高性能。
keepalive模塊
長連接對性能有很大的影響,通過減少CPU和網路開銷需要開啟或關閉連接;
http_ssl_mole模塊
Nginx開啟支持Https協議的SSL模塊
linux內核參數部分默認值不適合高並發,Linux內核調優,主要涉及到網路和文件系統、內存等的優化,
下面是我常用的內核調優配置:
文件描述符
文件描述符是操作系統資源,用於表示連接、打開的文件,以及其他信息。NGINX 每個連接可以使用兩個文件描述符。
例如如果NGINX充當代理時,通常一個文件描述符表示客戶端連接,另一個連接到代理伺服器,如果開啟了HTTP 保持連接,這個比例會更低(譯註:為什麼更低呢)。
對於有大量連接服務的系統,下面的設置可能需要調整一下:
精簡模塊:Nginx由於不斷添加新的功能,附帶的模塊也越來越多,建議一般常用的伺服器軟體使用源碼編譯安裝管理;
(1) 減小Nginx編譯後的文件大小
(2) 指定GCC編譯參數
修改GCC編譯參數提高編譯優化級別穩妥起見採用 -O2 這也是大多數軟體編譯推薦的優化級別。
GCC編譯參數優化 [可選項] 總共提供了5級編譯優化級別:
常用編譯參數:
緩存和壓縮與限制可以提高性能
NGINX的一些額外功能可用於提高Web應用的性能,調優的時候web應用不需要關掉但值得一提,因為它們的影響可能很重要。
簡單示例:
1) 永久重定向
例如,配置 http 向 https 跳轉 (永久)
nginx配置文件指令優化一覽表
描述:Nginx因為安全配置不合適導致的安全問題,Nginx的默認配置中存在一些安全問題,例如版本號信息泄露、未配置使用SSL協議等。
對Nginx進行安全配置可以有效的防範一些常見安全問題,按照基線標准做好安全配置能夠減少安全事件的發生,保證採用Nginx伺服器系統應用安全運行;
Nginx安全配置項:
溫馨提示: 在修改相應的源代碼文件後需重新編譯。
設置成功後驗證:
應配置非root低許可權用戶來運行nginx服務,設置如下建立Nginx用戶組和用戶,採用user指令指運行用戶
加固方法:
我們應該為提供的站點配置Secure Sockets Layer Protocol (SSL協議),配置其是為了數據傳輸的安全,SSL依靠證書來驗證伺服器的身份,並為瀏覽器和伺服器之間的通信加密。
不應使用不安全SSLv2、SSLv3協議即以下和存在脆弱性的加密套件(ciphers), 我們應該使用較新的TLS協議也應該優於舊的,並使用安全的加密套件。
HTTP Referrer Spam是垃圾信息發送者用來提高他們正在嘗試推廣的網站的互聯網搜索引擎排名一種技術,如果他們的垃圾信息鏈接顯示在訪問日誌中,並且這些日誌被搜索引擎掃描,則會對網站排名產生不利影響
加固方法:
當惡意攻擊者採用掃描器進行掃描時候利用use-agent判斷是否是常用的工具掃描以及特定的版本,是則返回錯誤或者重定向;
Nginx支持webdav,雖然默認情況下不會編譯。如果使用webdav,則應該在Nginx策略中禁用此規則。
加固方法: dav_methods 應設置為off
當訪問一個特製的URL時,如"../nginx.status",stub_status模塊提供一個簡短的Nginx伺服器狀態摘要,大多數情況下不應啟用此模塊。
加固方法:nginx.conf文件中stub_status不應設置為:on
如果在瀏覽器中出現Nginx自動生成的錯誤消息,默認情況下會包含Nginx的版本號,這些信息可以被攻擊者用來幫助他們發現伺服器的潛在漏洞
加固方法: 關閉"Server"響應頭中輸出的Nginx版本號將server_tokens應設置為:off
client_body_timeout設置請求體(request body)的讀超時時間。僅當在一次readstep中,沒有得到請求體,就會設為超時。超時後Nginx返回HTTP狀態碼408(Request timed out)。
加固方法:nginx.conf文件中client_body_timeout應設置為:10
client_header_timeout設置等待client發送一個請求頭的超時時間(例如:GET / HTTP/1.1)。僅當在一次read中沒有收到請求頭,才會設為超時。超時後Nginx返回HTTP狀態碼408(Request timed out)。
加固方法:nginx.conf文件中client_header_timeout應設置為:10
keepalive_timeout設置與client的keep-alive連接超時時間。伺服器將會在這個時間後關閉連接。
加固方法:nginx.conf文件中keepalive_timeout應設置為:55
send_timeout設置客戶端的響應超時時間。這個設置不會用於整個轉發器,而是在兩次客戶端讀取操作之間。如果在這段時間內,客戶端沒有讀取任何數據,Nginx就會關閉連接。
加固方法:nginx.conf文件中send_timeout應設置為:10
GET和POST是Internet上最常用的方法。Web伺服器方法在RFC 2616中定義禁用不需要實現的可用方法。
加固方法:
limit_zone 配置項限制來自客戶端的同時連接數。通過此模塊可以從一個地址限制分配會話的同時連接數量或特殊情況。
加固方法:nginx.conf文件中limit_zone應設置為:slimits $binary_remote_addr 5m
該配置項控制一個會話同時連接的最大數量,即限制來自單個IP地址的連接數量。
加固方法:nginx.conf 文件中 limit_conn 應設置為: slimits 5
加固方法:
加固方法:
解決辦法:
描述後端獲取Proxy後的真實Client的IP獲取需要安裝--with-http_realip_mole,然後後端程序採用java(request.getAttribute("X-Real-IP"))進行獲取;
描述: 如果要使用geoip地區選擇,我們需要再nginx編譯時加入 --with-http_geoip_mole 編譯參數。
描述: 為了防止外部站點引用我們的靜態資源,我們需要設置那些域名可以訪問我們的靜態資源。
描述: 下面收集了Web服務中常規的安全響應頭, 它可以保證不受到某些攻擊,建議在指定的 server{} 代碼塊進行配置。
描述: 為了防止某些未備案的域名或者惡意鏡像站域名綁定到我們伺服器上, 導致伺服器被警告關停,將會對業務或者SEO排名以及企業形象造成影響,我們可以通過如下方式進行防範。
執行結果:
描述: 有時你的網站可能只需要被某一IP或者IP段的地址請求訪問,那麼非白名單中的地址訪問將被阻止訪問, 我們可以如下配置;
常用nginx配置文件解釋:
(1) 阿里巴巴提供的Concat或者Google的PageSpeed模塊實現這個合並文件的功能。
(2) PHP-FPM的優化
如果您高負載網站使用PHP-FPM管理FastCGI對於PHP-FPM的優化非常重要
(3) 配置Resin on Linux或者Windows為我們可以打開 resin-3.1.9/bin/httpd.sh 在不影響其他代碼的地方加入:-Dhttps.protocols=TLSv1.2, 例如
原文地址: https://blog.weiyigeek.top/2019/9-2-122.html
『貳』 java文件太大會無法編譯么如果是,那麼文件大小的上限是多少k
大的java文件一樣可以編譯的 我曾經見一強人寫的8000行的類 一樣運行 文件上傳的大小是網站根據自己的實際而定的 並不存在固定值
『叄』 如何修改java編譯後的class文件
編譯之後的是修改不了了的,你可以把.java文件修改後再重新編譯一次,或者通過反編譯軟體把.class文件反編譯成.java文件然後再修改
『肆』 關於Java程序在Windows下運行的疑問!
Java程序是垮平台的,在windows上也能順利運行! 目前我所知道的在windows上運行的方法是 javac 再 java 或者在IDE里執行!
跨平台性說得就是可移植性好,什麼叫可移植性好呢?就是你在你的機器上編寫的代碼或者代碼編譯的class文件可以拿到別的機器上去運行,而這個別的機器可以是windows或者是linux或者是別的什麼系統,但是有個問題,用C寫得程序也可以拿到別的機器上運行,但這是有條件的,就是必須都是windows系統,因為C調運了很多操作系統內的函數什麼的,但JAVA沒有,純JAVA的語言所有的功能都是用JAVA寫成的,最典型的就是窗體,JAVA是畫的模擬出來的,但是像VB,可能就是調用的操作系統的窗體,所以說JAVA的可移植性較好
也就是它的跨平台性比較好
現在我們再說一下JAVA的運行方式,你寫的代碼是保存為.java文件的,JAVA編譯器把JAVA文件編譯為位元組碼文件(一種二進制文件),然後JAVA解釋器再解釋這種二進制文件然後執行
也就是說,寫代碼一般用JAVA解釋器和編譯器,但是運行由JAVA解釋器就可以了
可是如果我要把我的程序給別人用,難道我要把我的CLASS文件復制給別人 再叫別人安裝JDK或者JRE在CMD下用命令行來執行嗎???
如果你把你的class文件復制給別人,那麼它的機器必須的安裝JAVA解釋器才可以執行,這是必須的~~沒有解決的方式
但是你還要明白一個問陪扒題~~JAVA主要是運行在網路環境下的,這也是它的優勢和發展的動力,做j2ee項目時,他只要做網站的後台,扮薯而客戶只要有瀏覽器就可以獲得由JAVA在後台得到的數據,這時並不需要客戶安裝JAVA解釋器,因為JAVA文件是在後台伺服器上運行的
一般來說很少有用JAVA做桌面應用的,他就不適合來做,而且效果還沒有蘆缺昌vc++的好,所以並不需要客戶大規模的安裝JAVA運行環境
『伍』 JAVA初學問題!
Java新手入門的30個基本概念
在我們學習Java的過程中,掌握其中的基本概念對我們的學習無論是J2SE,J2EE,J2ME都是很重要的,J2SE是Java的基礎,所以有必要對其中的基本概念做以歸納,以便大家在以後的學習過程中更好的理解java的精髓,在此我總結了30條基本的概念。
Java概述:
目前Java主要應用於中間件的開發(middleware)---處理客戶機於伺服器之間的通信技術,早期的實踐證明,Java不適合pc應用程序的開發,其發展逐漸變成在開發手持設備,互聯網信息站,及車載計算機的開發.Java於其他語言所不同的是程序運行時提供了平台的獨立性,稱許可以在windows,solaris,linux其他操作系統上使用完全相同的代碼.Java的語法與C++語法類似,C++/C程序員很容易掌握,而且Java是完全的徹底的面向對象的,其中提出了很好的GC(Garbage Collector)垃圾處理機制,防止內存溢出。
Java的白皮書為我們提出了Java語言的11個關鍵特性。
(1)Easy:Java的語法比C++的相對簡單,另一個方面就是Java能使軟體在很小的機器上運行,基礎解釋其和類庫的支持的大小約為40kb,增加基本的標准庫和線程支持的內存需要增加125kb。
(2)分布式:Java帶有很強大的TCP/IP協議族的常式庫,Java應用程序能夠通過URL來穿過網路來訪問遠程對象,由於servlet機制的出現,使Java編程非常的高效,現在許多的大的web server都支持servlet。
(3)OO:面向對象設計是把重點放在對象及對象的介面上的一個編程技術.其面向對象和C++有很多不同,在與多重繼承的處理及Java的原類模型。
(4)健壯特性:Java採取了一個安全指針模型,能減小重寫內存和數據崩潰的可能型。
(5)安全:Java用來設計網路和分布系統,這帶來了新的安全問題,Java可以用來構建防病毒和防攻擊的System.事實證明Java在防毒這一方面做的比較好。
(6)中立體系結構:Java編譯其生成體系結構中立的目標文件格式可以在很多處理器上執行,編譯器產生的指令位元組碼(Javabytecode)實現此特性,此位元組碼可以在任何機器上解釋執行。
(7)可移植性:Java中對基本數據結構類型的大小和演算法都有嚴格的規定所以可移植性很好。
(8)多線程:Java處理多線程的過程很簡單,Java把多線程實現交給底下操作系統或線程程序完成.所以多線程是Java作為伺服器端開發語言的流行原因之一。
(9)Applet和servlet:能夠在網頁上執行的程序叫Applet,需要支持Java的瀏覽器很多,而applet支持動態的網頁,這是很多其他語言所不能做到的。
基本概念:
1.OOP中唯一關系的是對象的介面是什麼,就像計算機的銷售商她不管電源內部結構是怎樣的,他只關系能否給你提供電就行了,也就是只要知道can or not而不是how and why.所有的程序是由一定的屬性和行為對象組成的,不同的對象的訪問通過函數調用來完成,對象間所有的交流都是通過方法調用,通過對封裝對象數據,很大限度上提高復用率。
2.OOP中最重要的思想是類,類是模板是藍圖,從類中構造一個對象,即創建了這個類的一個實例(instance)。
3.封裝:就是把數據和行為結合起在一個包中)並對對象使用者隱藏數據的實現過程,一個對象中的數據叫他的實例欄位(instance field)。
4.通過擴展一個類來獲得一個新類叫繼承(inheritance),而所有的類都是由Object根超類擴展而得,根超類下文會做介紹。
5.對象的3個主要特性
behavior---說明這個對象能做什麼.
state---當對象施加方法時對象的反映.
identity---與其他相似行為對象的區分標志.
每個對象有唯一的indentity 而這3者之間相互影響.
6.類之間的關系:
use-a :依賴關系
has-a :聚合關系
is-a :繼承關系--例:A類繼承了B類,此時A類不僅有了B類的方法,還有其自己的方法.(個性存在於共性中)
7.構造對象使用構造器:構造器的提出,構造器是一種特殊的方法,構造對象並對其初始化。
例:Data類的構造器叫Data
new Data()---構造一個新對象,且初始化當前時間.
Data happyday=new Data()---把一個對象賦值給一個變數happyday,從而使該對象能夠多次使用,此處要聲明的使變數與對象變數二者是不同的.new返回的值是一個引用。
構造器特點:構造器可以有0個,一個或多個參數
構造器和類有相同的名字
一個類可以有多個構造器
構造器沒有返回值
構造器總是和new運算符一起使用.
8.重載:當多個方法具有相同的名字而含有不同的參數時,便發生重載.編譯器必須挑選出調用哪個方法。
9.包(package)Java允許把一個或多個類收集在一起成為一組,稱作包,以便於組織任務,標准Java庫分為許多包.java.lang java.util java,net等,包是分層次的所有的java包都在java和javax包層次內。
10.繼承思想:允許在已經存在的類的基礎上構建新的類,當你繼承一個已經存在的類時,那麼你就復用了這個類的方法和欄位,同時你可以在新類中添加新的方法和欄位。
11.擴展類:擴展類充分體現了is-a的繼承關系. 形式為:class (子類) extends (基類)。
12.多態:在java中,對象變數是多態的.而java中不支持多重繼承。
13.動態綁定:調用對象方法的機制。
(1)編譯器檢查對象聲明的類型和方法名。
(2)編譯器檢查方法調用的參數類型。
(3)靜態綁定:若方法類型為priavte static final 編譯器會准確知道該調用哪個方法。
(4)當程序運行並且使用動態綁定來調用一個方法時,那麼虛擬機必須調用x所指向的對象的實際類型相匹配的方法版本。
(5)動態綁定:是很重要的特性,它能使程序變得可擴展而不需要重編譯已存代碼。
14.final類:為防止他人從你的類上派生新類,此類是不可擴展的。
15.動態調用比靜態調用花費的時間要長。
16.抽象類:規定一個或多個抽象方法的類本身必須定義為abstract。
例: public abstract string getDescripition
17.Java中的每一個類都是從Object類擴展而來的。
18.object類中的equal和toString方法。
equal用於測試一個對象是否同另一個對象相等。
toString返回一個代表該對象的字元串,幾乎每一個類都會重載該方法,以便返回當前狀態的正確表示.
(toString 方法是一個很重要的方法)
19.通用編程:任何類類型的所有值都可以同object類性的變數來代替。
20.數組列表:ArrayList動態數組列表,是一個類庫,定義在java.uitl包中,可自動調節數組的大小。
21.class類 object類中的getclass方法返回ckass類型的一個實例,程序啟動時包含在main方法的類會被載入,虛擬機要載入他需要的所有類,每一個載入的類都要載入它需要的類。
22.class類為編寫可動態操縱java代碼的程序提供了強大的功能反射,這項功能為JavaBeans特別有用,使用反射Java能支持VB程序員習慣使用的工具。
能夠分析類能力的程序叫反射器,Java中提供此功能的包叫Java.lang.reflect反射機制十分強大.
1.在運行時分析類的能力。
2.在運行時探察類的對象。
3.實現通用數組操縱代碼。
4.提供方法對象。
而此機制主要針對是工具者而不是應用及程序。
反射機制中的最重要的部分是允許你檢查類的結構.用到的API有:
java.lang.reflect.Field 返回欄位.
java.reflect.Method 返回方法.
java.lang.reflect.Constructor 返回參數.
方法指針:java沒有方法指針,把一個方法的地址傳給另一個方法,可以在後面調用它,而介面是更好的解決方案。
23.介面(Interface)說明類該做什麼而不指定如何去做,一個類可以實現一個或多個interface。
24.介面不是一個類,而是對符合介面要求的類的一套規范。
若實現一個介面需要2個步驟:
1.聲明類需要實現的指定介面。
2.提供介面中的所有方法的定義。
聲明一個類實現一個介面需要使用implements 關鍵字
class actionB implements Comparable 其actionb需要提供CompareTo方法,介面不是類,不能用new實例化一個介面.
25.一個類只有一個超類,但一個類能實現多個介面。Java中的一個重要介面:Cloneable
26.介面和回調.編程一個常用的模式是回調模式,在這種模式中你可以指定當一個特定時間發 生時回調對象上的方法。
例:ActionListener 介面監聽.
類似的API有:java.swing.JOptionPane
java.swing.Timer
java.awt.Tookit
27.對象clone:clone方法是object一個保護方法,這意味著你的代碼不能簡單的調用它。
28.內部類:一個內部類的定義是定義在另一個內部的類。
原因是:
1.一個內部類的對象能夠訪問創建它的對象的實現,包括私有數據。
2.對於同一個包中的其他類來說,內部類能夠隱藏起來。
3.匿名內部類可以很方便的定義回調。
4.使用內部類可以非常方便的編寫事件驅動程序。
29.代理類(proxy):
1.指定介面要求所有代碼
2.object類定義的所有的方法(toString equals)
30.數據類型:Java是強調類型的語言,每個變數都必須先申明它都類型,java中總共有8個基本類型.4種是整型,2種是浮點型,一種是字元型,被用於Unicode編碼中的字元,布爾型。
一、入門
《Java 2從入門到精通》- 推薦
《Thinking in Java》- 強烈推薦*
O』reilly的Java編程基礎系列 - 參考*
二、進階
《Java Cook Book》- 非常推薦* (包含了Java編程的Tips,適合當做手冊來查閱)
《O』reilly-Java IO》- 推薦* (包含Java IO編程的各個方面)
《O』reilly-Database Programming with JDBC》- 推薦* (JDBC編程)
《O』reilly-Java Programming with Oracle JDBC》- 參考*
三、Java Web編程
《O』reilly-Java Server Pages》- 強烈推薦*
《O』reilly-Java Servlet Programming》- 非常推薦*
《O』reilly-Jakarta Struts》- 推薦* (Java Web編程的一個MVC實現框架Struts的書)
四、EJB編程
《J2EE應用與BEA Weblogic Server》- 強烈推薦
《Mastering EJB 2.0》- 非常推薦*
《Enterprise Java Bean》- 推薦*
五、Java XML編程
《O』reilly-Java and XML》- 推薦*
《O』reilly-Java and SOAP》- 參考* (Java的SOAP編程)
六、設計模式
《Core J2EE Patterns》- 強烈推薦* (J2EE設計模式,設計企業應用軟體必備參考書)
《EJB Design Patterns》- 推薦*
頁面功能 【加入收藏】 【推薦給朋友】 【字體:大 中 小】 【關閉】
java編程規范-
作者:佚名 來自:未知
命名規范
定義這個規范的目的是讓項目中所有的文檔都看起來像一個人寫的,增加可讀性,減少項目組中因為換人而帶來的損失。(這些規范並不是一定要絕對遵守,但是一定要讓程序有良好的可讀性)
Package 的命名
Package 的名字應該都是由一個小寫單片語成。
Class 的命名
Class 的名字必須由大寫字母開頭而其他字母都小寫的單片語成
Class 變數的命名
變數的名字必須用一個小寫字母開頭。後面的單詞用大寫字母開頭。
Static Final 變數的命名
Static Final 變數的名字應該都大寫,並且指出完整含義。
參數的命名
參數的名字必須和變數的命名規范一致。
數組的命名
數組應該總是用下面的方式來命名:
byte[] buffer;
而不是:
byte buffer[];
方法的參數
使用有意義的參數命名,如果可能的話,使用和要賦值的欄位一樣的名字:
SetCounter(int size){
this.size = size;
}
Java 文件樣式
所有的 Java(*.java) 文件都必須遵守如下的樣式規則
版權信息
版權信息必須在 java 文件的開頭,比如:
/**
* Copyright ? 2000 Shanghai XXX Co. Ltd.
* All right reserved.
*/
其他不需要出現在 javadoc 的信息也可以包含在這里。
Package/Imports
package 行要在 import 行之前,import 中標準的包名要在本地的包名之前,而且按照字母順序排列。如果 import 行中包含了同一個包中的不同子目錄,則應該用 * 來處理。
package hotlava.net.stats;
import java.io.*;
import java.util.Observable;
import hotlava.util.Application;
這里 java.io.* 使用來代替InputStream and OutputStream 的。
Class
接下來的是類的注釋,一般是用來解釋類的。
/**
* A class representing a set of packet and byte counters
* It is observable to allow it to be watched, but only
* reports changes when the current set is complete
*/
接下來是類定義,包含了在不同的行的 extends 和 implements
public class CounterSet
extends Observable
implements Cloneable
Class Fields
接下來是類的成員變數:
/**
* Packet counters
*/
protected int[] packets;
public 的成員變數必須生成文檔(JavaDoc)。Proceted、private和 package 定義的成員變數如果名字含義明確的話,可以沒有注釋。
存取方法
接下來是類變數的存取的方法。它只是簡單的用來將類的變數賦值獲取值的話,可以簡單的寫在一行上。
/**
* Get the counters
* @return an array containing the statistical data. This array has been
* freshly allocated and can be modified by the caller.
*/
public int[] getPackets() { return Array(packets, offset); }
public int[] getBytes() { return Array(bytes, offset); }
public int[] getPackets() { return packets; }
public void setPackets(int[] packets) { this.packets = packets; }
其它的方法不要寫在一行上
構造函數
接下來是構造函數,它應該用遞增的方式寫(比如:參數多的寫在後面)。
訪問類型 ('public', 'private' 等.) 和 任何 'static', 'final' 或 'synchronized' 應該在一行中,並且方法和參數另寫一行,這樣可以使方法和參數更易讀。
public
CounterSet(int size){
this.size = size;
}
克隆方法
如果這個類是可以被克隆的,那麼下一步就是 clone 方法:
public
Object clone() {
try {
CounterSet obj = (CounterSet)super.clone();
obj.packets = (int[])packets.clone();
obj.size = size;
return obj;
}catch(CloneNotSupportedException e) {
throw new InternalError('Unexpected CloneNotSUpportedException: ' + e.getMessage());
}
}
類方法
下面開始寫類的方法:
/**
* Set the packet counters
* (such as when restoring from a database)
*/
protected final
void setArray(int[] r1, int[] r2, int[] r3, int[] r4)
throws IllegalArgumentException
{
//
// Ensure the arrays are of equal size
//
if (r1.length != r2.length || r1.length != r3.length || r1.length != r4.length)
throw new IllegalArgumentException('Arrays must be of the same size');
System.array(r1, 0, r3, 0, r1.length);
System.array(r2, 0, r4, 0, r1.length);
}
toString 方法
無論如何,每一個類都應該定義 toString 方法:
public
String toString() {
String retval = 'CounterSet: ';
for (int I = 0; I < data.length(); i++) {
retval += data.bytes.toString();
retval += data.packets.toString();
}
return retval;
}
}
main 方法
如果main(String[]) 方法已經定義了, 那麼它應該寫在類的底部.
代碼編寫格式
代碼樣式
代碼應該用 unix 的格式,而不是 windows 的(比如:回車變成回車+換行)
文檔化
必須用 javadoc 來為類生成文檔。不僅因為它是標准,這也是被各種 java 編譯器都認可的方法。使用 @author 標記是不被推薦的,因為代碼不應該是被個人擁有的。
縮進
縮進應該是每行2個空格. 不要在源文件中保存Tab字元. 在使用不同的源代碼管理工具時Tab字元將因為用戶設置的不同而擴展為不同的寬度.
如果你使用 UltrEdit 作為你的 Java 源代碼編輯器的話,你可以通過如下操作來禁止保存Tab字元, 方法是通過 UltrEdit中先設定 Tab 使用的長度室2個空格,然後用 Format|Tabs to Spaces 菜單將 Tab 轉換為空格。
頁寬
頁寬應該設置為80字元. 源代碼一般不會超過這個寬度, 並導致無法完整顯示, 但這一設置也可以靈活調整. 在任何情況下, 超長的語句應該在一個逗號或者一個操作符後折行. 一條語句折行後, 應該比原來的語句再縮進2個字元.
{} 對
{} 中的語句應該單獨作為一行. 例如, 下面的第1行是錯誤的, 第2行是正確的:
if (i>0) { I ++ }; // 錯誤, { 和 } 在同一行
if (i>0) {
I ++
}; // 正確, { 單獨作為一行
} 語句永遠單獨作為一行.
如果 } 語句應該縮進到與其相對應的 { 那一行相對齊的位置。
括弧
左括弧和後一個字元之間不應該出現空格, 同樣, 右括弧和前一個字元之間也不應該出現空格. 下面的例子說明括弧和空格的錯誤及正確使用:
CallProc( Aparameter ); // 錯誤
CallProc(Aparameter); // 正確
不要在語句中使用無意義的括弧. 括弧只應該為達到某種目的而出現在源代碼中。下面的例子說明錯誤和正確的用法:
if ((I) = 42) { // 錯誤 - 括弧毫無意義
if (I == 42) or (J == 42) then // 正確 - 的確需要括弧
程序編寫規范
exit()
exit 除了在 main 中可以被調用外,其他的地方不應該調用。因為這樣做不給任何代碼代碼機會來截獲退出。一個類似後台服務地程序不應該因為某一個庫模塊決定了要退出就退出。
異常
申明的錯誤應該拋出一個RuntimeException或者派生的異常。
頂層的main()函數應該截獲所有的異常,並且列印(或者記錄在日誌中)在屏幕上。
垃圾收集
JAVA使用成熟的後台垃圾收集技術來代替引用計數。但是這樣會導致一個問題:你必須在使用完對象的實例以後進行清場工作。比如一個prel的程序員可能這么寫:
…
{
FileOutputStream fos = new FileOutputStream(projectFile);
project.save(fos, 'IDE Project File');
}
…
除非輸出流一出作用域就關閉,非引用計數的程序語言,比如JAVA,是不能自動完成變數的清場工作的。必須象下面一樣寫:
FileOutputStream fos = new FileOutputStream(projectFile);
project.save(fos, 'IDE Project File');
fos.close();
Clone
下面是一種有用的方法:
implements Cloneable
public
Object clone()
{
try {
ThisClass obj = (ThisClass)super.clone();
obj.field1 = (int[])field1.clone();
obj.field2 = field2;
return obj;
} catch(CloneNotSupportedException e) {
throw new InternalError('Unexpected CloneNotSUpportedException: ' + e.getMessage());
}
}
final 類
絕對不要因為性能的原因將類定義為 final 的(除非程序的框架要求)
如果一個類還沒有準備好被繼承,最好在類文檔中註明,而不要將她定義為 final 的。這是因為沒有人可以保證會不會由於什麼原因需要繼承她。
訪問類的成員變數
大部分的類成員變數應該定義為 protected 的來防止繼承類使用他們。
注意,要用'int[] packets',而不是'int packets[]',後一種永遠也不要用。
public void setPackets(int[] packets) { this.packets = packets; }
CounterSet(int size)
{
this.size = size;
}
編程技巧
byte 數組轉換到 characters
為了將 byte 數組轉換到 characters,你可以這么做:
'Hello world!'.getBytes();
Utility 類
Utility 類(僅僅提供方法的類)應該被申明為抽象的來防止被繼承或被初始化。
初始化
下面的代碼是一種很好的初始化數組的方法:
objectArguments = new Object[] { arguments };
枚舉類型
JAVA 對枚舉的支持不好,但是下面的代碼是一種很有用的模板:
class Colour {
public static final Colour BLACK = new Colour(0, 0, 0);
public static final Colour RED = new Colour(0xFF, 0, 0);
public static final Colour GREEN = new Colour(0, 0xFF, 0);
public static final Colour BLUE = new Colour(0, 0, 0xFF);
public static final Colour WHITE = new Colour(0xFF, 0xFF, 0xFF);
}
這種技術實現了RED, GREEN, BLUE 等可以象其他語言的枚舉類型一樣使用的常量。 他們可以用 == 操作符來比較。
但是這樣使用有一個缺陷:如果一個用戶用這樣的方法來創建顏色 BLACK
new Colour(0,0,0)
那麼這就是另外一個對象,==操作符就會產生錯誤。她的 equal() 方法仍然有效。由於這個原因,這個技術的缺陷最好註明在文檔中,或者只在自己的包中使用。
Swing
避免使用 AWT 組件
混合使用 AWT 和 Swing 組件
如果要將 AWT 組件和 Swing 組件混合起來使用的話,請小心使用。實際上,盡量不要將他們混合起來使用。
滾動的 AWT 組件
AWT 組件絕對不要用 JscrollPane 類來實現滾動。滾動 AWT 組件的時候一定要用 AWT ScrollPane 組件來實現。
避免在 InternalFrame 組件中使用 AWT 組件
盡量不要這么做,要不然會出現不可預料的後果。
Z-Order 問題
AWT 組件總是顯示在 Swing 組件之上。當使用包含 AWT 組件的 POP-UP 菜單的時候要小心,盡量不要這樣使用。
調試
調試在軟體開發中是一個很重要的部分,存在軟體生命周期的各個部分中。調試能夠用配置開、關是最基本的。
很常用的一種調試方法就是用一個 PrintStream 類成員,在沒有定義調試流的時候就為 null,類要定義一個 debug 方法來設置調試用的流。
性能
在寫代碼的時候,從頭至尾都應該考慮性能問題。這不是說時間都應該浪費在優化代碼上,而是我們時刻應該提醒自己要注意代碼的效率。比如:如果沒有時間來實現一個高效的演算法,那麼我們應該在文檔中記錄下來,以便在以後有空的時候再來實現她。
不是所有的人都同意在寫代碼的時候應該優化性能這個觀點的,他們認為性能優化的問題應該在項目的後期再去考慮,也就是在程序的輪廓已經實現了以後。
不必要的對象構造
不要在循環中構造和釋放對象
『陸』 如何減少編譯後的文件大小
易語言靜態編譯器是把所包含的支持庫直接跟執行文件一起編譯的,所以通常都比較大,如果想縮小的話直接編譯就可以了,但執行的系統如果沒有所含支持庫的話可能無法打開
『柒』 java中修改了一個包的一個文件後,編譯後,其他class文件會變嗎
java 這個語言相當的好,一個地方的修羨州改,不會影像到其他地方.如果a.java中方法沒有改變,只有實現改變了~那麼改變的只有a.class,要是a.java中的方法也變了!那麼其他地方,只要兄慎蔽調用a.java中方法的地方都要改孝升變.
『捌』 如何解決 用於 actionscript 3.0 編譯的 java 虛擬機內存不足
增加 Java 虛擬機的內存限制:在啟動 animate 時,使用 "-Xmx" 選項增加可用的內存量。例如,"-Xmx1024m" 表示最多可分配 1024 MB 的內存。
減小彎爛叢 Actionscript 3.0 編譯的文件大小:減小編譯文件的大小可以減少內存需求。可以考慮刪除不埋櫻必要的資源,壓縮圖像文件,或者使用更有效的圖像格式。
使用 64 位 Java 虛擬機:64 位 Java 虛擬機具有更大的可用內存,因此可以使用它來避免內存不足的問題。
拆分 Actionscript 3.0 編譯的文件:將大型的 Actionscript 3.0 編譯的文件拆分成較小的文件歷拆,可以減少單個文件所需的內存。
希望以上步驟可以幫助你解決 animate 用於 Actionscript 3.0 編譯時 Java 虛擬機內存不足的問題。
『玖』 在java編程中,java編譯器會將java程序轉換為
轉化為位元組碼。
一般java文件編譯過後會成為class文件,這個class文件就是位元組碼。
ava是一門面向對象的編程御絕語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理鎮鏈姿解的多繼承、指針等概念喚孝,因此Java語言具有功能強大和簡單易用兩個特徵。