电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

java安全編碼指南之:聲明和初始化說明

瀏覽:2日期:2022-08-24 17:47:29

簡介

在java對象和字段的初始化過程中會遇到哪些安全性問題呢?一起來看看吧。

初始化順序

根據(jù)JLS(Java Language Specification)中的定義,class在初始化過程中,需要同時初始化class中定義的靜態(tài)初始化程序和在該類中聲明的靜態(tài)字段(類變量)的初始化程序。

而對于static變量來說,如果static變量被定義為final并且它值是編譯時常量值,那么該static變量將會被優(yōu)先初始化。

那么使用了final static變量,是不是就沒有初始化問題了呢?

我們來看下面一個例子:

public class StaticFiledOrder { private final int result; private static final StaticFiledOrder instance = new StaticFiledOrder(); private static final int intValue=100; public StaticFiledOrder(){ result= intValue - 10; } public static void main(String[] args) { System.out.println(instance.result); }}

輸出結(jié)果是什么呢?

答案是90。 根據(jù)我們提到的規(guī)則,intValue是final并且被編譯時常量賦值,所以是最先被初始化的,instance調(diào)用了StaticFiledOrder類的構(gòu)造函數(shù),最終導致result的值是90。

接下來,我們換個寫法,將intValue改為隨機變量:

public class StaticFiledOrder { private final int result; private static final StaticFiledOrder instance = new StaticFiledOrder(); private static final int intValue=(int)Math.random()* 1000; public StaticFiledOrder(){ result= intValue - 10; } public static void main(String[] args) { System.out.println(instance.result); }}

運行結(jié)果是什么呢?

答案是-10。為什么呢?

因為instance在調(diào)用StaticFiledOrder構(gòu)造函數(shù)進行初始化的過程中,intValue還沒有被初始化,所以它有一個默認的值0,從而導致result的最終值是-10。

怎么修改呢?

將順序調(diào)換一下就行了:

public class StaticFiledOrder { private final int result; private static final int intValue=(int)Math.random()* 1000; private static final StaticFiledOrder instance = new StaticFiledOrder(); public StaticFiledOrder(){ result= intValue - 10; } public static void main(String[] args) { System.out.println(instance.result); }}

循環(huán)初始化

既然static變量可以調(diào)用構(gòu)造函數(shù),那么可不可以調(diào)用其他類的方法呢?

看下這個例子:

public class CycleClassA { public static final int a = CycleClassB.b+1;}public class CycleClassB { public static final int b = CycleClassA.a+1;}

上面就是一個循環(huán)初始化的例子,上面的例子中CycleClassA中的a引用了CycleClassB的b,而同樣的CycleClassB中的b引用了CycleClassA的a。

這樣循環(huán)引用雖然不會報錯,但是根據(jù)class的初始化順序不同,會導致a和b生成兩種不同的結(jié)果。

所以在我們編寫代碼的過程中,一定要避免這種循環(huán)初始化的情況。

不要使用java標準庫中的類名作為自己的類名

java標準庫中為我們定義了很多非常優(yōu)秀的類,我們在搭建自己的java程序時候可以很方便的使用。

但是我們在寫自定義類的情況下,一定要注意避免使用和java標準庫中一樣的名字。

這個應(yīng)該很好理解,就是為了避免混淆。以免造成不必要的意外。

這個很簡單,就不舉例子了。

不要在增強的for語句中修改變量值

我們在遍歷集合和數(shù)組的過程中,除了最原始的for語句之外,java還為我們提供了下面的增強的for循環(huán):

for (I #i = Expression.iterator(); #i.hasNext(); ) { {VariableModifier} TargetType Identifier = (TargetType) #i.next(); Statement}

在遍歷的過程中,#i其實相當于一個本地變量,對這個本地變量的修改是不會影響到集合本身的。

我們看一個例子:

public void noncompliantUsage(){ int[] intArray = new int[]{1,2,3,4,5,6}; for(int i: intArray){ i=0; } for(int i: intArray){ System.out.println(i); } }

我們在遍歷過程中,嘗試將i都設(shè)置為0,但是最后輸出intArray的結(jié)果,發(fā)現(xiàn)沒有任何變化。

所以,一般來說我們需要在增強的for語句中,將#i設(shè)置成為final,從而消除這種不必要的邏輯誤會。

public void compliantUsage(){ int[] intArray = new int[]{1,2,3,4,5,6}; for(final int i: intArray){ } for(int i: intArray){ System.out.println(i); } }

本文的例子:

learn-java-base-9-to-20/tree/master/security

補充知識:Java中String字符串初始化細節(jié)

Java中String類型細節(jié)

一 . String兩種初始化方式

1 . String str1= “abc”;//String類特有的創(chuàng)建字符對象的方式,更高效

在字符串緩沖區(qū)中檢測”abc”是否存在

若存在則不重復創(chuàng)建,將地址賦值給str1.

若不存在,則在字符串緩沖區(qū)中創(chuàng)建對象并賦地址給str1.

2 . String str1= new String( “abc”); //構(gòu)造函數(shù)初始化

 或者

 char [] ch={‘a(chǎn)’,’b’,’c’};

 String str1=new String (ch);

先有 “abc” 對象,然后拷貝給構(gòu)造函數(shù)創(chuàng)建的對象(相當于str1得到的是構(gòu)造函數(shù)的副本)

String對象是不可變的,它的內(nèi)容不能改變,而在程序中字符串頻繁使用,為了提高效率,對具有相同字符串序列的字符串直接量使用同一個實例,這樣的實例被稱之為限定的(interned)

注意,第二種方式的參數(shù)只支持字符串直接量或字符數(shù)組創(chuàng)建,這種方式是錯誤的 String strA = “asd”;

String strbB = new Strint(strA);

比較兩種創(chuàng)建方式,第一種更高效,只創(chuàng)建了一個對象,第二種創(chuàng)建了兩個對象。

二 . 初始化細節(jié)

棧中保存基本類型與對象的引用,基本類型在創(chuàng)建前會查看Stack中是否已經(jīng)有, 有則賦值指向, 沒有則創(chuàng)建。

String str1= “abc”;

String str1= new String( “abc”);

前者首先在棧中創(chuàng)建一個引用型變量str1,然后查看棧中是否存在“abc”如果沒有,則將“abc”存放進棧,并令引用變量str指向它;如果有,則直接令str1指向它;后者是java中標準的對象創(chuàng)建方式,其創(chuàng)建的對象將直接放置到堆中,每調(diào)用一次就會創(chuàng)建一個新的對象。

String str = “abc”+”def”;

這條語句創(chuàng)建對象個數(shù)? 1個。

編譯器會自己調(diào)用Stringbuilder的append方法來合成abcdef,最后只生成一個對象.

實際上,字符串直接量屬于常量,在編譯的時候已確定,兩個常量相加,先檢測棧內(nèi)存中是否有”abcdef” 如有有,指向已有的棧中的”abcdef”空間,若沒有,則創(chuàng)建。

package stringDemo;public class stringInitial{ public static void main(String[] args) { String str1 = 'abc'; String str2 = new String('abc'); // String str2 = new String(new char[] { ’a’, ’b’, ’c’ }); // String str2 = new String(str1);錯誤寫法 System.out.println(str1 == str2);// false System.out.println(str1.equals(str2));// true這里的equals()方法已經(jīng)被覆蓋,比較的是字符串不是地址 String str3 = '123'; String str4 = 'abc123'; String str5 = 'abc' + '123'; String str = str1 + str3; System.out.println(str4 == str5);// true System.out.println(str4 == str1+'123');// false System.out.println(str4 == str);// false }}

可以看出,只要是+中出現(xiàn)非字符串直接量,就會在堆中產(chǎn)生新的對象,并不會檢測棧內(nèi)存

三.關(guān)于String str=null;String str;String str=”“;

String str=null;

聲明了一個String的引用型變量并初始化為空,及未指向任何地址,不占用任何空間

String str;

只是聲明了一個String的引用型變量,并未初始化(作為對象屬性時會有默認的隱式初始化str=null),如果后面未用此變量編譯會通過

String str=”“;

正常的字符串初始化,只不過字符串內(nèi)容為空。

以上這篇java安全編碼指南之:聲明和初始化說明就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標簽: Java
相關(guān)文章:
主站蜘蛛池模板: 折弯机-刨槽机-数控折弯机-数控刨槽机-数控折弯机厂家-深圳豐科机械有限公司 | 净化车间装修_合肥厂房无尘室设计_合肥工厂洁净工程装修公司-安徽盛世和居装饰 | 飞象网 - 通信人每天必上的网站 全球化工设备网—化工设备,化工机械,制药设备,环保设备的专业网络市场。 | 不锈钢发酵罐_水果酒发酵罐_谷物发酵罐_山东誉诚不锈钢制品有限公司 | 变色龙云 - 打包app_原生app_在线制作平台_短链接_ip查询 | 运动木地板厂家,篮球场木地板品牌,体育场馆木地板安装 - 欧氏运动地板 | 抖音短视频运营_企业网站建设_网络推广_全网自媒体营销-东莞市凌天信息科技有限公司 | 振动台-振动试验台-振动冲击台-广东剑乔试验设备有限公司 | 熔体泵_熔体出料泵_高温熔体泵-郑州海科熔体泵有限公司 | 软瓷_柔性面砖_软瓷砖_柔性石材_MCM软瓷厂家_湖北博悦佳软瓷 | 精密钢管,冷拔精密无缝钢管,精密钢管厂,精密钢管制造厂家,精密钢管生产厂家,山东精密钢管厂家 | 英国公司注册-新加坡公司注册-香港公司开户-离岸公司账户-杭州商标注册-杭州优创企业 | 自动记录数据电子台秤,记忆储存重量电子桌称,设定时间记录电子秤-昆山巨天 | 成都APP开发-成都App定制-成都app开发公司-【未来久】 | 涂层测厚仪_漆膜仪_光学透过率仪_十大创新厂家-果欧电子科技公司 | 北京康百特科技有限公司-分子蒸馏-短程分子蒸馏设备-实验室分子蒸馏设备 | 中央空调温控器_风机盘管温控器_智能_液晶_三速开关面板-中央空调温控器厂家 | 政府回应:200块在义乌小巷能买到爱情吗?——揭秘打工族省钱约会的生存智慧 | 电采暖锅炉_超低温空气源热泵_空气源热水器-鑫鲁禹电锅炉空气能热泵厂家 | 宁夏档案密集柜,智能密集柜,电动手摇密集柜-盛隆柜业宁夏档案密集柜厂家 | 亮化工程,亮化设计,城市亮化工程,亮化资质合作,长沙亮化照明,杰奥思【官网】 | 多功能干燥机,过滤洗涤干燥三合一设备-无锡市张华医药设备有限公司 | PCB接线端子_栅板式端子_线路板连接器_端子排生产厂家-置恒电气 喷码机,激光喷码打码机,鸡蛋打码机,手持打码机,自动喷码机,一物一码防伪溯源-恒欣瑞达有限公司 假肢-假肢价格-假肢厂家-河南假肢-郑州市力康假肢矫形器有限公司 | 锻造液压机,粉末冶金,拉伸,坩埚成型液压机定制生产厂家-山东威力重工官方网站 | 小型单室真空包装机,食品单室真空包装机-百科 | 换网器_自动换网器_液压换网器--郑州海科熔体泵有限公司 | 浴室柜-浴室镜厂家-YINAISI · 意大利设计师品牌 | 咿耐斯 |-浙江台州市丰源卫浴有限公司 | 组织研磨机-高通量组织研磨仪-实验室多样品组织研磨机-东方天净 传递窗_超净|洁净工作台_高效过滤器-传递窗厂家广州梓净公司 | 流程管理|流程管理软件|企业流程管理|微宏科技-AlphaFlow_流程管理系统软件服务商 | 智慧食堂_食堂管理系统_食堂订餐_食堂消费系统—客易捷 | 切铝机-数控切割机-型材切割机-铝型材切割机-【昆山邓氏精密机械有限公司】 | 复盛空压机配件-空气压缩机-复盛空压机(华北)总代理 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 天助网 - 中小企业全网推广平台_生态整合营销知名服务商_天助网采购优选 | 玉米加工设备,玉米深加工机械,玉米糁加工设备.玉米脱皮制糁机 华豫万通粮机 | 浙江栓钉_焊钉_剪力钉厂家批发_杭州八建五金制造有限公司 | 复盛空压机配件-空气压缩机-复盛空压机(华北)总代理 | 网优资讯-为循环资源、大宗商品、工业服务提供资讯与行情分析的数据服务平台 | 蓄电池回收,ups电池后备电源回收,铅酸蓄电池回收,机房电源回收-广州益夫铅酸电池回收公司 | 消电检公司,消电检价格,北京消电检报告-北京设施检测公司-亿杰(北京)消防工程有限公司 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! |