java程序员述职报告
java程序员述职报告(精选6篇)
java程序员述职报告 第1篇
java程序员述职报告
java程序员述职报告
先自我简介一下,本人从事java开发进一年,xx届毕业生,XX年11月开始上班,之前做asp,XX年2月后开始做java,由于公司转型,现在带十几个人在一起搞java开发,主要是关于准金融行业的行业管理软件。总结在会议上也写了,但仅限于对于工作总结及XX年工作计划,自我总结较少,因此今天专门做下自我的总结,主要从技术、管理、人生上面谈谈这一年的收获,前辈路过欢迎多多指正。
技术
我在学校里学的是电气自动化,程序基础仅限于c基础课程的一些知识,后来由vb、html转向asp,在asp上花费了不少时间,对asp比较熟悉,后来由于公司业务需要,将开发平台转向java,开始对java不是很感冒,以为就是asp的一点扩展(那时还不知道三层架构,数据数据访问全在页面里——!),后来招来几个北大青鸟的过来终于意识到java的强大之处,经过个人的努力已经逐步掌握了java,现在层次上只能讲个人觉得是入门而已,原因是多方面的,待会儿会讲到。
相信从面向过程转向面向对象的同学都有一种感觉:面向对象开始真的有点别扭,涉及到属性,尤其是类之间的各种关系,那时老想用面向过程传递参数多方面啊。于是老在想对象这种东西,从概念中跳中来,以自己的方式去理解才逐渐体会到页面对象的精华来,分层次展现、分级别访问、封装对象之间各种关系逐渐真正理解了,尤其是对象之间的关系,如对象a与对象b两者之间的关系,有些需要完全公开,有些需要隐藏,有些需要通过第三方传递,有些需要给自己的下级可见,有些需要让下级去完成具体操作——这不是现实的实际模型吗?应该这么理解,面向对象来源于现实,它不是一种凭空空想出来的理论,这些对象之间的关系可以将其还原为父子、夫妻、领导下属、同事、朋友之间的关系。相比之下,页面过程往往像是一股脑全部推给用户使用,其中的数据与数据访问方法层次不清晰,在模拟现实上它与面向对象相比更易于入门理解,实质上难于准确直接地表述。
面向对象上另一方面是它的设计模式,在之前的面向过程中 对这个设计模式并没有清晰地提出来,面向过程优秀的代码要求高内聚低耦合,从个人的理解上,这仅是对软件开发方法“技”上理论总结;设计模式是达到了“道”的层次,因为它从更大的方向、更抽象的层次来去表述具体的代码模块之间的关系,可以认为设计模式是完全从实际的应用来不断总结得来的经验,之间并没有这种术语,但相信前人肯定也使用到这种思想,它从实际应用于来,当然要应用于实际工作中,认真思考不断总结每个人都会有自己的“设计模式”,可以借鉴前人的思想来去提升自己,不可去为“设计模式”而设计模式。
具体到java的实现模型中,真正理解它的机制与方法也就不难理解,记住b/s中离不开post或get,所有的autopostback、selectedindexchanged……都是去调用form传值,加上runat=server的服务器控件打开它生成的源文件也是普通的html标签,微软的让软件开发更容易的思路是很好的,时代在前进,很多年前你使用c写出mis证明你很牛,很多年之后你不在使用c去写“学生管理系统”、“图书馆管理系统”那只能说明你的脑子少一根筋,开发语言都有长处与不足的地方,因为它们适用的场合不同,类似不能拿匕首去跟炮弹比,也不能拿c与php比,程序员都有一种偏执的心理,但一点要记住,你面对的用户才有最终发言权,程序能不能满足需要,易用性、稳定性、成本才是应当首先放到重要位置来去谈的。
管理
最开始担任管理一职时开发团队加我在内只有四个人,那时只是抱着接受挑战的心理去做管理,加上我本人比较重感情,团队之间关系相处都不错,但严重的问题逐渐显露出来:工作的随意性、团队精神薄弱、工作方式蛮干,印象深刻的是有几个开始承诺项目不能完工,于是最后天天加班,一直做到早上6点,睡一会7点半接着上班,几个同事都是年龄差不多的小伙子,干劲十足。后来随着时间的推进,问题越来越摆在眼前:项目迟迟不能完工,又由于公司待遇方面让新员工感觉不值得,于是形成了老板抱怨员工也抱怨的状况,我在中间两点都要去“消火”,这期间是我们部门相对最累的时间但也是相对感觉最充实的时候,后来,之前的员工跟我说“再也找不到那种感觉了”,这是我能想像的。这期间主要是老总对我十分信任,工作上主要是管理方法上对我指点了不少。后来我逐步体会到,管理应该是“大家定规则去遵守”,而不应该是“人管人”。
人管人很容易陷入一个误区:领导去时时刻刻关注每个员工,这样最后往往后造成员工对领导的敷衍了事,管理松了员工会责任下下降,管理紧了造成员工与领导关系紧张,另一方面领导时间精力有限必然耗费大量的精力在日常的监督中而不能投入到全局的管理中。
于是“定制度-定分工-定进度”,明确日常所有的规章制度,这期间除了公司主要的工作规章制度外其他的日常工作纪律、日常管理等规章制度都是我本人制订,然后征求大家意见最后去贯彻执行。中间也遇到了不少问题,比如开始我们内部是允许使用qq的,后来员工用qq闲聊的时间增多,大大影响了工作效率,最后决心禁止,开始阻力较大(貌似程序员都喜欢挂上几个qq去到群里搞个群主,虽然群里大多都是菜鸟),最后多次开会,逐个谈话,阐明道理,形势逐渐好转。
项目分工上针对技术水平明确分工,制订项目开发计划,由于开始技术都不是很成熟,不少时间我这边强势要求,使用野蛮方法,完不成加班——我陪着加班,这段时间能感觉到员工对我稍有怨言但总体还是认可的。
这期间公司新招人员,人员的增多更使我意识到团队管理的重要性,这期间版本控制、编码规范、文档管理、bug管理等诸多问题都得到一一解决,技术水平上主要是我个人利用空余时间学习新知识充电,然后展开各种培训,主要是photoshop、css、js、sql等方面,培训一方面提升了员工的技术水平,一方面我本人在学习培训的过程中得到的最多,因为这个时候个人要求去思考的会更多,加上我本人对技术兴趣比较深厚,所以后期工作慢慢踏入良性循环。
待遇低、条件艰苦、工作时间长、工作压力大是团队中最大的难题,这方面公司在某些方面决策层有着严重的错误思想,造成技术人员对公司埋怨增多,在这方面我本人只能以劝架婆的身价去安慰身边的兄弟,因为我明白现在公司的问题与当前中国软件行业的通病一样,盲目追求利益最大化,不求质量,但求速度,整个社会风气造成软件行业良莠不齐发展,整个中国三四个人的开发团队组成的公司数不胜数,整个程序员阶层生存状况可想而知,疯狂加班、代码质量低下、维护成本大、稳定性差、用户体验差……。
当然我们本身不能去逃避这个现状,对于个人来讲任何假大空的口号都是没有意义的,程序员作为技术人员最重要的是心态,以良好的心态去面对各种问题,发现问题、解决问题,发现问题抱怨是解决不了问题的(“it民工”是我个人认为it人最没有正确的自我定位的一个称谓,试想一个人连自己都看不起自己的职业,他能做好自己的工作吗?),最主要是解决问题。
我在面试员工时反复提到的三点是:工作态度、发展潜力、工作能力,由前向后排序,心态最重要,大公司大家都想削尖脑袋往里挤,但名额有限,所以广大的程序员同志绝大多数都集中在二流三流四流的软件公司,这个时候更应该做好个人职业定位。以我个人的经验,新员工选择一家公司往往最看重工资待遇跟发展潜力,程序员是一种不可以混日子的职业,工作能力很重要,但不是最主要的,工作态度是最重要的,工作态度往往跟个人的思想认识还有职业所在的环境有关,我个人的体会是绝不能太过于情绪化,情绪化无论是对工作还是对个人的发展都是不利的,就是说哪怕是明天你要辞职,你今天都要把今天要做的事情认真用心做好。
对于工作责任心不够的员工是尤其值得关注的,他们往往自我意识过于强烈,追求以自我为中心,很多时候伴随着工作得不到认可、工作感觉不充实不开心,我会主动找他谈话,我认识:你管理的是一个实实在在的人,他不是一台任你摆布的机器,人会有情绪往往是有心结,找到原因,多加开导,用心去关心每个成员。对于实在不适合在本团队发展的员工要做好最坏打算。程序员这个职业与现在的大学生具有一致的特征,一个是从天之骄子沦为多余人,一个是从高智商人士成为今天中国通行的”it民工“。另一方面是程序员往往年龄集中在20-25之间的男性中,情绪化、失落感、心理不成熟等一系列问题都会出现。但这个阶段的人往往也最易沟通,可塑性也较强,适当的引导、合理的方式会比野蛮的管理效果强上百倍。
java程序员述职报告
大家好,我是XXX项目组的XXX,我于20xx年7月进入公司做JAVA程序开发,至今已近快一年时间了。初来公司,曾经很担心不知该怎么与人共处,该如何做好工作;但是公司融洽的工作氛围、团结向上的企业文化让我较快适应了公司的工作环境。在本部的工作中,我一直严格要求自己,认真及时做好领导布置的每一项任务。不懂的问题虚心向同事请教,不断提高充实自己,希望可以为公司做出更大的贡献。
当然,刚做这个项目的时候,难免出现一些小差小错需领导指正;但前事之鉴,后事之师,这些经历也让我不断成熟,在处理各种问题时考虑得更全面,杜绝类似失误的发生。在此,我要特地感谢部门的领导和同事对我的指引和帮助,感谢他们对我工作中出现的失误的提醒和指正。总结经验是一个人迅速成长的有利催化剂,为了更快地成为一名优秀的员工,现将我20xx年上半年的学习、工作情况总结如下:
20xx年初时,我们进销存项目通过了一期客户验收。但是,随着客户业务的变化,项目需要做很大的改动和调整。现进销存系统进入了二期的设计开发阶段。
初入公司的时候,我只负责财务模块的存货核算开发工作。随着公司人员的变动,现在我负责财务管理整个模块的开发工作。很明显的能感觉的身上的压力越来越大,也许是因为我的个性使然吧,越挫越勇,迎难而上。不断的学习财务业务知识和本系统框架,现基本了解掌握了财务的整个业务逻辑及业务流程。因为没有参与一期的原型、需求、设计、数据库等文档的设计。
在开发过程中发现,有好多原型、需求文档、设计文档,只知其然,不知其所以然。总结一期经验,避免二期开发中遇到同样的问题和困难。从原型设计、谈二期需求、整理需求文档、数据库设计、开发,一条龙负责到底。这样对业务逻辑及业务流程有了更深的理解。从“我问”,到“我讲”,有了很大的个人提高。提高软件知识和技术只是问题的表面,本质是要提高自己认识问题、分析问题、解决问题的思想高度。在能胜任工作的基础上,立即去涉猎其它领域的专业知识,丰富自己的知识体系、提高自己的综合素质。
我相信付出肯定会有收获,在我们的努力下,进销存系统一定会给客户及公司一个满意的答案。
在这一年里,我看到公司的迅速发展,各项制度的不断完善,我很庆幸我是公司的一员,我会用谦虚的态度和饱满的热情做好我的本职工作,为公司创造价值,同公司一起创造美好的未来。
java程序员述职报告 第2篇
2015年春季期末Java程序设计报告
项目名称:基于Java平台开发的五子棋程序设计
学 院: 物理与电子科学学院
专 业:电子信息科学与技术
班 级:2 0 1 3 级 电 信 一 班
组员姓名:杨邦桂 许勇 董俊宏 课程教师: 程 满
目录
引言...........................................................................................................................................4 第一章 设计目的和要求.........................................................................................................4 第二章JAVA语言概述.........................................................................................................4 2.1 JAVA简介........................................................................................................................4 2.1.1 JAVA的基本特点.....................................................................................................4 2.2 JAVA工具
JDK............................................................................................................5 第三章 程序的设计思路和算法.............................................................................................5 3.1 人机博弈的要点............................................................................................................5 3.2 五子棋特点及规则......................................................................................................5 3.3 设计思路......................................................................................................................6 3.3.1...................................................................................................................................6 第四章 测试及运行效果.........................................................................................................6 4.1棋盘系统主界面.............................................................................................................6 4.2下期博弈过程界面.........................................................................................................7 4.3黑方赢的结果.................................................................................................................7 4.4白方赢的结果.................................................................................................................8 第五章 设计体会与总结.........................................................................................................9 附录.........................................................................................................................................10 源程序代码及简要说明:.................................................................................................10
引言
随着计算机技术的不断发展,网络技术的普及范围越来越广,网络能够提供的服务多样、便捷,已经成为人们生产生活中不可缺少的重要组成部分。如今网络休闲游戏发展迅速,它凭借健康、方便、互动性强、益智等诸多优点,成为大部分现代人休闲娱乐的首选。
网络五子棋游戏是使用Java语言开发的一款游戏。它使用SOCKET建立连接,多线程处理数据,以及可嵌入网络浏览器的APPLET作为客户端,这些特点使这款游戏无论是服务器还是客户端的实现都相对容易。通过对该软件的编写,还可以巩固学生对以上各种知识的掌握和理解。
第一章 设计目的和要求
1.1 实现一个简单的五子棋游戏程序,包括如下两个界面:(1)对弈及角色(黑方先落棋)。
(2)在游戏界面,有游戏栏(开局、悔棋、退出),帮助栏; 显示区;棋盘区。1.2在实际系统中使用、实现人工智能的相关算法
1.3进一步加深对人工智能算法的理解
第二章JAVA语言概述
2.1 JAVA简介
JAVA是Sun Microsystem公司开发的编程语言,是一个简单,面向对象,分布式,解释性,强壮,安全,与系统无关,可移植,高性能,多线程和动态的语言。
2.1.1 JAVA的基本特点
(1)简单性
Java与C++语言非常相近,但Java比C++简单,它抛弃了C++中的一些不是绝对必要的功能,如头文件、预处理文件、指针、结构、运算符重载、多重继承以及自动强迫同型。Java实现了自动的垃圾收集,简化了内存管理的工作。
(2)面向对象
Java提供了简单的类机制和动态的构架模型。对象中封装了它的状态变量和方法,很好地实现了模块化和信息隐藏;而类则提供了一类对象的原型,通过继承和重载机制,子类可以使用或重新定义父类或超类所提供的方法,从而既实现了代码的复用,又提供了一种动态的解决方案。
(3)多线程
多线程使应用程序可以同时进行不同的操作,处理不同的事件。在多线程机制中,不同的线程处理不同的任务,他们之间互不干涉,不会由于一处等待影响其他部分,这样容易实现网络上的实时交互操作。
(4)分布性
Java是面向网络的语言。通过它提供的类库可以处理TCP/IP协议,用户可以通过URL地址在网络上很方便的访问其他对象。(5)体系结构中立
Java是一种网络语言,为使Java程序能在网络的任何地方运行,Java解释器生成与体系结构无关的字节码结构的文件格式。为了使Java的应用程序能不依赖于具体的系统,Java语言环境还提供了用于访问底层操作系统功能的类组成的包,当程序使用这些包时,可以确保它能运行在各种支持Java的平台上。
(6)安全性
用于网络、分布环境下的Java必须要防止病毒的入侵,Java不支持指针,一切对内存的访问都必须通过对象的实例变量来实现,这样就防止了程序员使用欺骗手段访问对象的私有成员,同时也避免了指针操作中容易产生的错误。
2.2 JAVA工具
JDK
(1)Java编译器
Java编译器将Java源代码文件编译成可执行的Java字节码。Java源代码文件的扩展名为.java,Java编译器把这种扩展名的文件编译成扩展名为.class的文件。源文件中的每个类在编译后都将产生一个class文件,这意味一个Java源代码文件可能编译生成多个class文件。
(2)Java解释器
Java解释器对编译生成的字节码格式的可执行程序的运行提供支持,它是运行非图形Java程序的命令行工具。
第三章 程序的设计思路和算法
3.1 人机博弈的要点
人机对弈的程序,至少应具备以下5个部分:
(1)某种在机器中表示棋局的方法,能够让程序知道博弈的状态。(2)产生合法走法的规则,以使博弈公正地进行,并可判断人类对手是否乱走。(3)从所有合法的走法中选择最佳的走法技术。(4)一种评估局面优劣的方法,用以同上面的技术配合做出智能的选择。(5)一个界面,有了他,这个程序才能用。
3.2 五子棋特点及规则
五子棋的娱乐性强、规则简单、易学、流行性广。普通人不需长时间专门训练即可自如行棋。因此极受大众欢迎。五子棋的规则为:
(1)棋盘
采用像围棋盘一样的15路或19路线的棋盘,在此采用19路的棋盘。
(2)下法
两人分别执黑白两色棋子。轮流在棋盘上选择一个无子的交叉点落子,无子的交叉点又被称为空点。
(3)输赢判断
黑、白双方有一方的五个棋子在横、竖或斜方向上连接成一线即为该方赢。
(4)特殊规定
职业五子棋虽然对黑棋采取了种种限制,但黑子先行的优势依然很大。因此,在高段位的职业比赛中,又出现了三种特殊的规定。
a.指定打法:是指比赛双方按照约定好的开局进行对弈,由白棋先行。
b.三手可交换:是指黑棋下盘面第3手棋后,白方在下第四手之前,如感觉黑方棋形不利于己方,可提出交换,即执白棋一方变为执黑棋一方,而黑方不可以不换。
c.五手两打法:是指黑棋在下盘面上关键的第5手棋时,必须下两步棋,让白棋在这两步棋中拿掉一粒棋子,然后再继续对弈。一般说来,白棋肯定拿掉对白方不利的一点,而保留对黑方较为不利的那点让黑方行棋。3.3 设计思路
3.3.1开始——下棋——判断输赢——结束游戏或重新再来——退出。
1.建立一个棋盘类,绘制棋盘的样式,在棋盘面板上添加各种按钮及相应胡触发事件。同时注意面板的设计,使面板设计的尽量胡的合理美观。2.编写一个功能判断落子的位置及画出相应的黑白棋子。3.判断胜负
第四章 测试及运行效果
4.1棋盘系统主界面
图4-1初始化棋盘效果,玩家为黑棋 4.2下棋博弈过程界面
图4-2黑白棋博弈
4.3黑方赢的结果
图4-3黑方胜利界面
4.4白方赢的结果
图4-4白方胜利界面
第五章 设计体会与总结
Java编程最强大的地方不是它是容易学,或者难学,而是它拥有一个强大的库。JAVA是一个完全面向对象的语言,JAVA的命名规则是很容易让人接受的。而且容易被编程人员记住。经过实践训练,对JAVA的综合应用能力有了较大的提高,另外对JAVA的特点有了更深层次的认识。这次实践中使用的代码虽然不长,但类与类之间也有很强的逻辑关系,这就是面向对象语言的最大优势,这样可使我们更轻松的运用JAVA。
经过努力,查阅相关资料,终于完成该课题,虽然效果不是很好,但亲手做过之后还是很有成就感的。
通过此次课程设计,将我本学期所学的JAVA知识得到巩固和应用,在设计的过程中我遇到了很到问题,不过在老师和同学们的帮助和自己的思考下还是很好的完成了。这此课程设计还让我懂得了写程序不能闭门造车,要努力拓宽知识面,开阔视野,拓展思维。它还让我学会了在网上查阅那些无限的资料。通过对此课题的开发,使我对用Eclipse开发平台有了一个比较清楚的认识,体会到理论和实践的重要性。由于自己的分析设计和程序经验不足,该系统设计和实现过程中,还有许多没有完善的地方,比如用户界面设计不够美观,异常出错处理比较差等多方面问题,这些都有待进一步完善和提高。
附录
源程序代码及简要说明:
import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.Timer;import java.util.TimerTask;import java.lang.Thread;public class WZQ_2008 extends Frame implements ActionListener { Timer t=new Timer(true);//Thread mt=new MyThread(this);MenuBar mb=new MenuBar();Menu myx=new Menu(“游戏”);Menu mbz=new Menu(“帮助”);MenuItem mikj=new MenuItem(“开局”);MenuItem mihq=new MenuItem(“悔棋”);MenuItem mitc=new MenuItem(“退出”);MenuItem migy=new MenuItem(“关于”);int x=0;int y=0;String stb=“五子棋游戏
请黑方落子”;String stw=“五子棋游戏
请白方落子”;boolean isBlack=true;String str=“Game Over”;boolean over=false;int count=0;int jj=30;int r=25;String str1;int [][]date=new int[15][15];
int i=0;public WZQ_2008(){
this.setMenuBar(mb);
mb.add(myx);
mb.add(mbz);
myx.add(mikj);mikj.addActionListener(this);mikj.setEnabled(false);myx.add(mihq);mihq.setEnabled(false);mihq.addActionListener(this);myx.add(mitc);mitc.addActionListener(this);mbz.add(migy);migy.addActionListener(this);this.setTitle(stb);this.setBounds(100,100,485,500);this.setBackground(new Color(206,148,49));this.setResizable(false);this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){
System.exit(0);} });this.addMouseListener(new MouseAdapter(){ public void mousePressed(MouseEvent e){
if(over)
{
return;
}
x=(e.getX()-30+jj/2)/jj;
y=(e.getY()-60+jj/2)/jj;
if(x<0||x>14||y<0||y>14)
{
return;
}
if(date[x][y]!=0)
{
return;
}
if(isBlack)
{
setTitle(stw);
date[x][y]=1;
}
else
{
setTitle(stb);
date[x][y]=2;
}
mikj.setEnabled(true);
mihq.setEnabled(true);
isBlack=!isBlack;
pd();
repaint();
} });this.setVisible(true);
} public void pd(){ int xq=0,xz=14;int yq=0,yz=14;if(x-4>0){
xq=x-4;} if(x+4<14){
xz=x+4;} if(y-4>0){
yq=y-4;} if(y+4<14){
yz=y+4;} pdh(xq,xz);count =0;pds(yq,yz);count=0;pdfx(xq,xz);count=0;pdzx(xq,xz);} public void pdzx(int xq,int xz){ for(int i=xq;i<=xz;i++){
if(y+x-i<0)
{
break;
}
if(y+x-i>14)
{
continue;
}
if(date[i][y+x-i]==date[x][y])
{
count++;
isOver();
}
else
{
count=0;
} } } public void pdfx(int xq,int xz){ for(int i=xq;i<=xz;i++){
if(y-x+i<0)
{
continue;
}
if(y-x+i>14)
{
break;
}
if(date[i][y-x+i]==date[x][y])
{
count++;
isOver();
}
else
{
count=0;
} }
} public void pds(int yq,int yz){ for(int i=yq;i<=yz;i++){
if(date[x][i]==date[x][y])
{
count++;
isOver();
}
else
{
count=0;
} } } public void pdh(int xq,int xz){ for(int i=xq;i<=xz;i++){
if(date[i][y]==date[x][y])
{
count++;
isOver();
}
else
{
count=0;
} } } public void isOver(){ if(count==5){
over=true;
if(date[x][y]==1)
{
str1=“黑方胜利”;
}
else if(date[x][y]==2)
{
str1=“白方胜利”;
}
//mt.start();
//for(int i=0)
t.schedule(new MyTimer(this),100,500);
this.repaint();} } public void actionPerformed(ActionEvent e){ if(e.getSource()==mikj){
mikj.setEnabled(false);
mihq.setEnabled(false);
for(int i=0;i { for(int j=0;j { date[i][j]=0; } } isBlack=true; this.setTitle(stb); over=false; this.repaint();} if(e.getSource()==mihq){ mihq.setEnabled(false); date[x][y]=0; if(isBlack) { this.setTitle(stw); } else { this.setTitle(stb); } isBlack=!isBlack; this.repaint();} if(e.getSource()==mitc){ this.dispose();} if(e.getSource()==migy){ new MyAbout(this);} } public void update(Graphics g){ paint(g);} public void paint(Graphics g){ Image ii=this.createImage(485,500);Graphics gg=ii.getGraphics();paintBuffer(gg);g.drawImage(ii,0,0,this);} public void paintBuffer(Graphics g){ for(int i=0;i<15;i++){ g.drawLine(30,60+i*jj,30+14*jj,60+i*jj); g.drawLine(30+i*jj,60,30+i*jj,60+14*jj);} for(int i=0;i for(int j=0;j { if(date[i][j]==1) { g.setColor(Color.BLACK); } else if(date[i][j]==2) { g.setColor(Color.WHITE); } else { continue; } //抗锯齿,使绘画出来的图形更圆滑 Graphics2D g2d=(Graphics2D)g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); g.fillOval(30-jj/2+i*jj,60-jj/2+j*jj,r,r); } } if(over) { g.setColor(Color.GRAY); g.setFont(new Font(“楷体”,3,70)); g.drawString(str,45,250); g.drawString(str1,48,350); g.setColor(Color.RED); g.setFont(new Font(“楷体”,3,70)); g.drawString(str,50,253); g.drawString(str1,60,353); mihq.setEnabled(false); } } public static void main(String[]args){ new WZQ_2008(); } } class MyAbout extends Dialog { Button bok=new Button(“确定”);public MyAbout(WZQ_2008 wzq){ super(wzq,“百纳科技五子棋”,true); this.add(bok); bok.setBounds(180,250,60,20); this.setLayout(null); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { dispose(); } }); bok.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { dispose(); } }); this.setBounds(100,100,400,300); this.setResizable(false); this.setVisible(true);} public void paint(Graphics g){ Image ii=new ImageIcon(“about.jpg”).getImage(); g.drawImage(ii,0,0,this);} } class MyTimer extends TimerTask { WZQ_2008 wzq;boolean b=true;public MyTimer(WZQ_2008 wzq){ this.wzq=wzq;} public void run(){ if(!wzq.over) { return; } if(b) { wzq.str=“Game Over”; } else { wzq.str=“"; } b=!b; wzq.repaint(); wzq.i++; if(wzq.i==11) { cancel(); wzq.i=0; } System.out.println(wzq.i);} } /*class MyThread extends Thread { WZQ_2008 wzq;boolean b=true;public MyThread(WZQ_2008 wzq){ this.wzq=wzq;} public void run(){ if(!wzq.over) { return; } if(b) { wzq.str=”Game Over“; } else { wzq.str=”"; } b=!b; wzq.repaint();} 在一些传统的编程语言(如C语言)中,回收内存的任务是由程序本身负责的。程序可以显式的分配/释放变量所占用的内存。在Java语言中,内存回收的任务由JVM(Java虚拟机)来担当,JVM提供了一个系统级的垃圾回收器(Gar bage Col l ect or,GC)线程,它负责自动回收那些无用对象所占用的内存,这种内存回收的过程被称为垃圾回收。Java程序员只需通过内存分配操作创建对象,而无须关心对象占用的空间是如何被收回的。因此很多程序员认为在Java中不必担心内存泄漏问题,然而实际并非如此,Java中仍然存在内存泄漏。 1 Java中的内存泄漏 1.1 GC的工作原理 内存泄漏,通常是指分配出去以后,却无法收回的内存空间。在Java中,内存的回收是通过GC自动实现的,对程序员来说是透明的,因此,要讨论Java的内存泄漏问题,必须从GC的工作原理谈起。 GC通过监控对象的运行状态(包括申请、引用、被引用、赋值等)及时准确的释放对象,而释放对象的根本原则就是在可达测试(Reachabi l i t y Test)[1]中从根对象不可达。GC从根对象(堆栈对象、静态对象、JNI句柄指向的对象等)开始,利用有向图按照引用关系遍历整个堆空间,所有被遍历到的对象即为“活”的对象,“活”的对象GC不能进行回收。GC把那些失去引用,从根不可达的对象删除,释放内存。 1.2 J ava内存泄漏的定义 J ava中的内存泄漏是存在一些被分配的对象,这些对象存在以下两个特点:首先,这些对象是可达的,即在有向图中,存在通路可以使其与根相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以被判定为Java中的内存泄漏,这些对象不会被GC回收,而它们却仍然占着内存。如图一所示。 现在越来越多的服务器采用Java技术,而服务器程序往往长期运行,因此Java的内存泄漏问题就不容忽视,否则即使是只有少量的泄漏,长期运行之后,也会导致耗尽全部的可用内存而导致系统崩溃的危险。 2 几种典型的内存泄漏及解决方法 在程序中要查明代码引起泄漏的原因是很困难的,但大多数Java程序中的内存泄漏情况却十分相似,下面介绍几种典型的内存泄漏及其解决方法。 2.1 未彻底清除失效对象。 常见的是废弃聚集的引用(Obsol et e Col l ect i on Refer ences):对象加入到一个聚集中,当其不再需要时并没有被移去,当该聚集用St at i c声明且在程序的整个生命周期中存在时问题尤为突出[2]。还有一种典型的错误是对临时对象的引用,临时对象使用后就会成为垃圾,但此时若还保持对其引用,就会使得GC无法回收这些失效的对象。 解决方式:及时清除失效对象的引用、尽量少用静态集合类、减少临时对象的使用、对象不用时最好显式的设置为Nul l。 2.2 类装载器 J ava类装载器的使用为内存泄漏提供了许多可乘之机。由于类装载器不仅仅只与对象引用有关,同时也和对象内部的引用有关,比如数据变量,方法和各种类。这意味着只要存在对数据变量、方法、各种类和对象的类装载器,那么类装载器将驻留在JVM中。因为类装载器在和很多类关联的同时又可以和静态数据变量关联,那么相当多的内存就可能发生泄漏[3]。 2.3 全局集合 大型应用程序中存在各种各样的全局数据仓库,Java程序中,不能在所有类之外定义全局变量,只能通过在一个类中定义公用、静态的变量来实现全局变量。由于静态的变量会永驻内存,难免造成内存泄漏。 常用的解决方式是周期运行的清除作业。这个作业会验证仓库中的数据然后清除一切不需要的数据。另一个解决办法是引用记数(Ref er ence Count i ng)[3]。集合负责统计集合中每个元素的引用者数量。引用者会通知集合什么时候已经对元素不再引用。当引用者的数目为零时,该元素就可以从集合中移除了。 2.4 高速缓存 高速缓存是一种用来快速查找已经执行过的操作结果的数据结构。缓存通常都是以动态方式实现的,如果缓存设置不正确而大量使用缓存的话则会出现内存溢出(Out Of Memor y Er r or)。 为避免这种错误,程序可以确定高速缓存在它所使用的内存中有一个上界,当高速缓存所占空间超过该上界时,移除缓存中旧的数据,释放缓存空间。另一个解决途径是使用J ava.l ang.r ef.Sof t Ref er ence类坚持将对象放入高速缓存。这个方法可以保证当JVM用完内存或者需要更多堆的时候,可以释放这些对象的引用。 3 Java内存泄漏的研究现状 对无用对象保持引用是造成内存泄漏的主要原因,因此针对Java内存泄漏的研究主要是通过分析对象是否仍有用以及对象之间的引用关系来进行的。 3.1 针对对象是否仍然有用 J VM利用有向图进行可达测试发现“活”的对象,“活”的对象GC将不进行回收,但是“活”的对象不一定就是有用的对象,因此无用对象的确定对发现内存泄漏有着至关重要的作用。文献[4]针对Java中的临时对象的创建而造成的内存泄漏提出了这样一种场景(Scenar i o):创建临时对象的时候,给出其期望的生命周期,当该对象的生命周期超出该期望期时,该对象就有可能是内存泄漏对象[2,3,4]。文献[5]针对J ava中的数组,提出了一个结合向前数据流分析和向后控制流分析算法标志变量的关系,并确定数组中元素的有用区域,算法给出个程序点相关的变量间的约束关系以及在各点依然有用的数组元素,GC利用数组间的约束关系回收不再有用的数组变量[2,3,4,5]。 3.2 针对对象间的引用关系 通过分析对象或者类之间的引用关系找出可疑的实例或者区域。专业检测内存泄漏工具Jpr obe Memor y Debugger正是基于对实例的引用树(Ref er ence Tr ee)和被引用树(Ref er r er Tr ee)的分析来判定该实例是否为可疑的泄漏对象。JDK TM1.2中定义了对象引用应用程序设计接口,该应用程序设计接口允许应用程序以对象引用的方式与JVM的内存管理器进行交互。应用对象引用队列可以创建这样一个环境:当通过对象引用获得某一对象时,应用程序得到通知。然后,应用程序就可以对相关对象进行跟踪和清除操作,这样就减少了内存泄漏。 3.3 针对对象行为的分析 文献[2]提出通过分析对象行为来确定该对象是否为内存泄漏对象的设想,同一个类的多个对象,使用逻辑的不同导致其行为不同,从而导致了某些对象被回收,而某些对象未被回收。用对象生存期行为模型来描述对象从创建开始到被销毁为止的整个时间段内的行为,通过分析泄漏对象和未泄漏对象的行为差异,获取导致泄漏的对象行为。然后在该基础上通过深入研究对象行为来确定更多的内存泄漏[2]。 3.4 针对根对象的研究 GC利用有向图从根对象开始遍历所用的引用,某对象由根可达,则保留之,不可达则释放之。由此,根对象的选择对GC显得尤为重要。如果根对象选择的不适宜,则可能使很多无用对象仍可以从根对象可达,无法被回收。文献[6]通过进行类型分析(Type Anal ysi s)以获得比较适合的根对象,同时分析变量是否有用使仍可用的对象成为根对象。 4 内存泄漏的检测、处理及改进 4.1 检测内存泄漏的存在 一般说来,一个正常的系统在其运行稳定后其内存的占用量是基本稳定的,不应该是无限制的增长。同样,对任何一个类的对象的使用个数也有一个相对稳定的上限,不应该是持续增长的。根据这样的基本假设,我们持续地观察系统运行时使用内存的大小和各实例的个数,如果内存的大小持续地增长,则说明系统存在内存泄漏,如果特定类的实例对象个数随时间而增长,则说明这个类的实例可能存在泄漏情况 [7]。 另一方面发生内存泄漏的一个迹象是:在应用程序中出现了Out Of Memor y Er r or。也有可能应用程序确实正在使用这么多的内存,但是在许多情况下Out Of Memor y Er r or都是内存泄漏的信号。一种查明方法是不间断地监控GC的活动,确定内存使用量是否随着时间增加。如果确实如此,就可能发生了内存泄漏。 4.2 处理内存泄漏的方法 一旦知道确实发生了内存泄漏,就需要更专业的工具来进行处理。这些专业工具从JVM获得内存系统信息的方法基本上有两种:JVMTI(Java Vi r t ual Machi ne Tool s I nt erf ace)和字节码技术。J VMTI及其前身J VMPI(J ava Vi r t ual Machi ne Pr of i l i ng I nt er f ace)都是标准接口,作为外部工具同JVM进行通信,搜集JVM的信息。字节码仪器则是引用通过探针获得工具所需的字节信息的预处理技术。 目前的大多数工具,要么是基于JVMTI创建Java堆转储,并离线分析它;要么是基于JVMTI获取Java程序时刻信息(堆信息及对象的分配、引用关系等)。而JVMTI会加大内存开销使程序的执行变得非常缓慢。下面简单介绍一下内存泄漏检测工具JRocki t Memor y Leak Det ect or。 J Rocki t Memor y Leak Det ect or是一种实时检测基于BEA J VM运行的J ava程序内存泄漏的工具,它内嵌于BEA J Rocki t J VM,支持在系统全速运行时使用,而不会引起通常与此类工具相关联的性能开销,因此不存在上述一般工具的缺点。该工具通过三步处理泄漏。 (1)通过趋势分析发现那些对象类存在泄漏。J Rocki t Memor y Leak Det ect or为用户提供了一个趋势分析,趋势分析可以说明应用程序中每个类使用堆空间的情况。它将告诉你某一类型的实例使用了多少空间、它们占用了堆的哪一部分、存在多少个实例以及每秒钟堆空间使用的增加速度,增长最快的对象就是值得怀疑的对象。 (2)找出同泄漏对象相关的其他类。可以在趋势分析表中选择一个怀疑类型,所有具有指向选中类型的实例的类型都可以显示在一个图中,用户可以回溯到导致引用的最终原因。类的实例可以被显示和内观,指向一个选中实例的所有实例都可以在一张实例图中显示出来,可以打开分配跟踪,跟踪某个类的所有分配情况。 (3)向下发掘,观察独立的对象之间是如何相互联系的。 同时,该工具也可以动态的找出所有内存分配的堆栈路径。利用这三个特性,将该工具紧紧地集成在JVM中,那么就可以安全有效的捕捉和修复内存泄漏了。 4.3 改进内存泄漏的方式 在实际应用中若能根据GC的运行机制有针对性的进行设计和编码,可以减少甚至避免内存泄漏的发生,具体措施包括以下几个方面。 (1)少用静态对象变量、静态集合类。像Has h Map、Vect or等静态集合类的生命与应用程序一样长,被其引用的对象GC无法回收,容易造成内存泄漏。 (2)慎用内部类。内部类中隐藏着外部类的对象实例的引用,一旦没有释放,可能导致一系列对象得不到释放。 (3)简化对象引用关系、及时清除静态变量的引用、对象不用时显式的设置为nul l。 (4)勿用长生命周期对象管理短生命周期对象。 (5)使用J ava.l ang.r ef包。该包中定义了三个引用类:Sof t Ref er ence、Weak Ref er enc、Phant om Ref er ence。可以解决未知或者多余对象引用造成的内存泄漏。 (6)及时关闭物理连接。比如数据库连接和网络连接,除非显式的关闭,否则不会被GC自动回收。 (7)使用Fi nal i ze方法清除本地系统资源。本地系统资源是通过Java以外的函数获得的资源,GC无法回收。可以在Fi nal i ze方法中加入清除内存代码,解决本地系统资源得不到释放造成的内存泄漏。 (8)调用对象的特定方法清除引用或释放资源。有些对象不再被使用时会提供用来清除引用或释放资源的方法,如对话框的Di spose方法、容器组件的Romove方法、Swi ng组件UI的Uni nst al l方法等。 5 结束语 内存泄漏是一个特别重要又难以解决的问题,不再有用的对象被其他依然有用的对象的引用是导致内存泄漏的主要原因。良好的编程风格和专业的检测工具可以有效地减少内存泄露,但如何更好地避免甚至消除内存泄漏、如何解决因内存泄漏而导致的Java程序系统性能下降问题将是内存泄漏相关领域的重要研究方向。 摘要:Java有比较安全的内存管理机制,垃圾回收器(GC)会自动地对无用的内存空间进行回收,但是GC并不能回收所有的垃圾空间,仍然存在着内存泄漏。本文从GC的工作原理入手,详细分析了产生内存泄漏的原因,讨论了几种典型内存泄漏及解决的方法,介绍了内存泄漏的相关研究及发展趋势,指出了检测和处理内存泄漏的方式,给出了避免内存泄漏的建议。 关键词:内存泄漏,垃圾回收,引用 参考文献 [1]QUEST公司.JProbe Memory Debugger Developer's Guide[R].2005. [2]贾晓霞,吴际,金茂忠等.Java程序内存泄漏综述[J].计算机应用研究,2006,(09):1-3. [3]Staffan Larsen.Memory Leaks,Be Gone[EB/OL].http://dev2dev.bea.com/pub/a/2005/06/memory_leaks.html,2005-06. [4]Wim De Pauw,Gary Sevitsky.Visualizing Reference Patterns for Solving Memory Leaks in Java[C].Lisbon:Pro-ceedings of the13th Europ ean Conference on OO Program-ming,1999:116-134. [5]RShaham,E K Kolodner,M Sagiv.Automatic Re-moval of Array Memory Leaks in Java[C].Berlin:Compiler Construction,the9th International Conference,volume1781of Lecture Notes in Computer Science,2000:50-66. [6]Agesen O,Detlefs D,MOSS J E B.Garbage Collection and Local Variable Typeprecisionand Liveness in Java Virtual Machines[C].New York:Programming Language Design and Implementation(PLDI),1998:269-279. 关键词:Java程序;混淆技术;软件水印;防篡改;软件版权保护 中图分类号:TP311.52 文献标识码:A 文章编号:1007-9599 (2012) 09-0000-02 人们对于计算机的依赖性随着软件技术的不断给人们带来便利和乐趣,使工作更富有主动性和操作性,但是任何事物在发展过程中都会有其负面效应与之相对,随着计算机软件应用量和种类的不断扩展,其使用安全问题便开始影响到人们的正确使用,并开始逐渐打击使用计算机的积极性,以及对于安全问题的无奈。主要攻击形式是通过对软件备份的破坏而直接将软件彻底摧毁,根据现有问题,当前的软件已经经过改良,重新调试,但是攻击则换角度也将攻击破解方式进行重组,使改良的部分无法发挥其作用,这样软件就不会得到应有的保护,依旧能够以非正规途径得到软件的任何数据,从而进行大面积的传播,这也就是为何当今软件盗版现象严重的途径之一。Java程序的出现,首先能够在网络上加快传播速度并且无客观條件可以轻松普及,但同时却能够通过无关性对产权进行有效的保护,不会轻易的被人盗用。 一、软件混淆技术基本原理 (一)基本释义 软件混淆技术是为了能够在软件受到侵害或是盗用时可以被保护的一种现代技术,软件技术首先咋1977年新西兰首次被提出,其实是将原有的程序的语言转换成一种密码语言,不能被一般的软件所识破的一种转换,并且研制出能够对这种转换进行评估的理论计算。转换的形式未变,只是在形式上保留原有的运行根组成,添加一些其他能够扰乱破坏和读取的程序代码。如今混淆技术开始不断的发展,诸多的被应用于产权的保护中,所谓的混淆就是通过语词的转变但保持其语义依然与之前相同,这就能保证软件在使用时功能是不变的,却能够防止逆向工程攻击和被静态分析。 (二)软件混淆技术的分类 当Java文件经过处理,在原有的基础上添加了其他程序代码成为类文件,这种类文件包括魔数( magic number) 、版本( version) 、常量池( constant pool ) 、访问标识( access flag s) 、(this)类、(super)类、接口( interfaces) 、域( fields) 、方法(methods) 和属性(attributes) 。 软件混淆主要通过类内混淆和类间混淆来根据不同的使用对象进行划分,类内混淆主要是克服(methods)中的code字段,而类间混淆却是针对多种类文件的综合体进行混淆处理,其主要的方式是合并和拆分相对的过程处理。 下面分别介绍两种混淆。 (1)、类内混淆 能够支持类内混淆的途径有数据混淆、控制混淆、切片混淆以及针对特定工具混淆四种。数据混淆是对数据的结构组成元素原有的书写方式进行修改,使其不再成为能够被认知的程序。主要有:变量存储和编码混淆、变量聚合混淆、顺序调整混淆、词法混淆以及移除注释和调试信息混淆。控制混淆是在信息传输过程中的保护,主要采取追踪定位等方式实时监测信息的状态,从而对其他袭击系统进行抵御。切片混淆,正常在一般的软件中问了能够让计算机更好的识读软件,所以增加了切片以帮助更好的理解,降低难度,而混淆了切片则能够使其首先无法有助于难度的下降,另外会造成对于程序的误导可能降低了或是更改了某些其他的程序,达到了增加难度混淆的目的。针对特定工具混淆软件为了能够起到保护作用,本身具有一定的反编译和反混淆的功能,会在一定的紧急时刻自动启动,而针对特定工具就是抑制了自动的传导,对于能够使软件本身内部之间的反编译都可以正常的进行,但是对于外部的反编译就不会在自动启动,这就是混淆的高级之处。相区别与前三者人的行为,针对特定工具混淆具有自动的功能针对的是自动化。如果能够与以上三种任意搭配就能够达到防住人机的共同目的。 (2)、类间混淆 类间混淆是合并拆分类文件而造成混淆的目的其中又有三种表现形式:类合并、类拆分、隐形类间混淆。类合并是要面对多个文件的自身组成的函数变量,通过将函数、变量的名称进行更改,注意在更改过程中一定不能同时出现两个或以上的名子,如果在合并中有参数同系统提示无法进行更改,则要为其中一个虚拟一个参数。另外如果合并文件中有继承关系的则需要在合并成功后加入一个布尔型的私有变量用于区分标识符相同的函数。类拆分则是观察现有的文件是否进行拆分,同时并作出相应的调整。对于结果是可拆分的类就是将A拆分为A1与A2,为了能够使A的要素都能够实现所以应该是A2处于继承A1关系。类型隐藏是通过接口来实现混淆,并且能够保证原文件并不需要改变接口,所以被称为隐形。相比类合并,类拆分和隐形类间混淆所用的时间相对较短。 二、软件混淆算法的攻击模式 (一)混淆算法的理论研究 混淆技术的提出者曾经试图将整个运行过程当做是一个虚拟黑箱来看,也就是说对于其他程序来说这就完全是另外一个软件和原软件无任何联系,从它的输入和输出的方式内容和代码都不同,这种在理论中是可以站的住的,但是在实际操作中会受到很多因素的限制,但在相对宽松的要求下还是可以实现混淆技术的使用。后来又根据该理论研究通过点函数来实现虚拟黑箱,总而言之其未来的研究空间还有很大,期待它的日益成熟。 (二)混淆算法的攻击模式 1.针对数据混淆算法的攻击 假定T 是对程序P 的一个单向的混淆变换,当且仅当从原始程序P 除去某些信息后,无法通过混淆后的程序Pc恢复出P。词法变换是最典型的不可逆混淆算法。虽然对于经过词法变换的程序进行攻击不可能恢复程序的原貌,但只要理解程序各个模块的含义就可能对程序产生威胁。例如根据无法被混淆的系统API 名称等关键字,攻击者可以推测出该模块的大致功能。 2.针对控制流混淆算法的攻击 目前,针对控制流混淆算法的主要攻击方法是动态分析。动态分析对大部分混淆算法的攻击作用,并阐述攻击模型. 对于控制流混淆而言, 变换后生成的程序中若存在始终不执行的分支,通过动态分析就能找到对破解程序有用的信息.针对控制流混淆,还有黑盒测试攻击, 该方法通过对程序进行黑盒测试,了解各个类及其函数的功能, 从而获取攻击者需要的信息. 这种方法对大多数的混淆变换均能加以攻击。同时,该方法也存在着一定的局限性: 黑盒测试缺乏自动分析工具,需要依靠大量的人力来完成分析工作。 三、对于混淆技术的未来预估 混淆技术是一种可用于抵制逆向工程和重组工程、对软件知识产权进行保护的程序变换技术。使用混淆技术虽然会使代码的效率有一定程度的降低,但是它的实现代价相对较小, 因而在近年引起了广泛的关注.由于混淆技术不改变程序功能的特性, 并且有些词法混淆算法甚至可以减小原程序的体积, 因此混淆技术得以在保护移动代码方面得到广泛的应用. 受移动平台资源的限制,今后混淆技术的研究方向一方面要加大混淆的力度,增加攻击者反编译的难度,另一方面也要考虑降低混淆算法对目标程序的运行负担。文献探讨了混淆技术在移动代理上的应用。目前保护软件知识产权的新技术主要有3种:混淆技术、软件水印技术和防篡改技术。这3种技术各有特长,将它们互相结合使用,可以给予目标软件更为可靠的保护,这也是目前研究的一个重要方向。对于混淆算法的评估、正确性验证以及如何研制高效可靠的混淆算法, 也是将来的发展方向之一。 四、总结 混淆技术是对软件进行的基础产权保护,为了能够增加破译的难度和代价,从而使产权盗版的情况发生率降低,同时还能提高软件水银的鲁棒性,有人提出将程序的编译混淆, 而不是混淆程序本身。但是该方法还有若干问题需要考虑。使软件的安全度进一步提升,给人们的使用带来了更多的福音,虽然该技术已经广泛运用也颇收到好评,在技术上依旧有大的发展前景,需要投入更多的研究力量。 参考文献: [1]霍建雷,范训礼,房鼎益.Java标识符重命名混淆算法及其实现[J].计算机工程,2010,第1期 [2]咸星海.面向对象代码混淆技术研究及软件实现[J].中国科技博览,2010,第19期 [3]刁俊峰.软件安全中的若干关键技术研究[D],北京:北京邮电大学,2007 [4]李新良,罗戈夕.基于Java的代码混淆算法研究[J].湖南文理学院学报:自然科学版,2010,第3期 [5]霍建雷,范训礼.房鼎益,Java标识符重命名混淆算法及其实现[J].计算机工程,2010,第1期 [6]李婧.基于控制流混淆轉换的代码保护技术[J].计算机安全,2009,第8期 [7]袁征,冯雁,温巧燕,张华.构造一种新的混淆Java程序的不透明谓词[J].北京邮电大学学报,2007,第6期 《Java程序设计》 实习报 告 中原工学院信息商务学院 经济管理系 2010年6月20号 中原工学院信息商务学院 目录 一、实习题目...............................................................................................2 二、实习目的...............................................................................................2 1、社会需求.............................................................................................................2 2、专业需求.............................................................................................................2 三、开发环境...............................................................................................2 四、实习内容...............................................................................................3 1、系统功能需求..................................................................................................3 2、数据库需求........................................................................................................4 五、设计过程...............................................................................................4 1、总体设计.............................................................................................................4 2、详细设计.............................................................................................................5 六、调试过程...............................................................................................5 七、实习小结...............................................................................................5 八、参考资料...............................................................................................6 中原工学院信息商务学院 一、实习题目 学生信息管理系统的设计与开发 二、实习目的 1、社会需求 一直以来学生的成绩管理是学校工作中的一项重要内容,随着办学规模的扩大和招生人数的增加,学校工作繁杂、资料重多,普通的成绩管理已不能适应时代的发展,它浪费了许多的人力和物力。在当今信息时代这种传统的管理方法必然被以计算机为基础的信息管理系统所代替。虽然管理信息系统已进入高校,但还未普及而且对于学生成绩管理来说,还没有一套完整的、统一的系统,建立一个成绩维护系统是非常必要的。建立学生成绩管理系统,采用计算机对学生成绩进行管理,能进一步提高办学效益和现代化水平。帮助广大教师提高工作效率,实现学生成绩维护工作流程的系统化、规范化和自动化。 2、专业需求 《Java程序设计》课程是电子商务专业的一门专业必修课程,通过java实习不仅可以提升本专业我们对此课程中的理论知识的综合应用能力而且可以提高我们的逻辑思维能力、软件开发能力。我们通过Java技术在Windows平台下开发学生信息管理系统。能够切实提高我们的程序设计水平,在实践中掌握面向对象程序设计的开发思想。 三、开发环境 操作系统;Windows XP 编程环境:MyEclipse 6.0 中原工学院信息商务学院 主要技术:Java Swing实现窗体界面 JDBC实现数据库操作 系统架构:三层架构(MVC)+DAO设计模式 数据库:MySQL5.0 四、实习内容 1、系统功能需求 学生信息管理系统主要对在校学生的个人基本信息以及成绩信息进行管理,对教师用户提供查询信息、增添信息、删除信息等操作功能;对学生用户提供成绩查询功能。我们的目标就是为该系统提供前台用户界面设计以及后台连接数据库程序设计,系统程序界面采用Java Swing组件实现,数据库操作采用JDBC实现。 学生信息管理系统要面对教师和学生用户。对于教师,需要查询全部学生的基本信息和成绩信息,并且可以对其进行修改。对于学生,不需要查询自己的基本信息,只需要查询成绩。为了保护学生成绩隐私,每位学生登录系统后只能查询自己的成绩,而无法看到别人的成绩。 教师方面:教师通过自己的用户名和密码登录后,进入教师主界面,在这个主界面里,可以选择要操作的类别,即查询功能还是修改功能。在查询功能里面,可以选择是查询学生基本信息,还是查询学生成绩信息。在查询学生基本信息时,可以从依据不同字段,即学生信息表的不同属性进行查找。在查找学生成绩信息时,只能依据学生姓名和学号进行查找。在修改功能里面,包括对学生基本信息表和学生成绩表进行增加和删除记录。 学生方面:学生通过自己的用户名和密码登录此系统后,可以查询自己本学期的各科成绩信息。 中原工学院信息商务学院 2、数据库需求 依据功能需求,学生信息管理系统主要有三个表:student表、teacher表和score表 (1)student(学生信息表) 此表有六个属性,分别为:id(主键,自动递增),num(学号),sname(姓名),sex(性别),age(年龄),dept(系别)。(2)teacher(教师登录表) 此表有三个属性列,分别为:id(主键,自动递增),tname(教师账户),password(登录密码)。(3)score(教师登录表) 此表有六个属性列:分别为:id(主键,自动递增),num(学号),sname(学生姓名),course(课程名称),score(考试成绩),credit(学分)。 五、设计过程(包括总体设计和详细设计); 1、总体设计 这次java实习设计的学生信息管理系统,是对学生的个人信息,课程信息,成绩信息以信息化的方式进行管理,最大限度地减少各个环节可能出现的错误,有效减少因人力资源局限性导致的存储信息量大,信息存储错误,混淆等问题,合理进行信息存储,使学校能够合理录入学生的个人资料,学期成绩情况,以及课程安排,为学校师生的工作提供后方面。根据需求我们设计的学生信息管理系统教师可以查询、增添、删除学生信息,学生可以查询成绩信息。 中原工学院信息商务学院 2、详细设计 这次Java实习,首先,我们在机房装上了MyEclipse 6.0、navicat、MySQL等程序。其次,我们敲程序代码。源于程序的运行过程是进入提供用户输入机会的“视图层”,进而进入控制用户输入的“控制层”,最后到达“数据操作层”。我们新建工程,建立connection、dao、model、ui包,在connection包中建DBConnection类,在dao包中建ScoreDao、StudentDao、TeacherDao类,在model包中建Score、Student类,在包ui中建LoginUI、ScoreAddUI、ScoreDeleteUI、ScoreQueryUI、StudentAddUI、StudentDeleteUI、StudentQueryUI、StudentScoreUI、TeacherMainUI类。最后链接数据库。出现了主界面、教师登录、学生登录界面。 六、调试过程 在程序设计过程中出现了许多问题,现对我的经历做出以下论述: 1、编写程序时单词拼写错误,程序无法运行。 2、导入包时导错以至于下面的程序一直有错,最后只能重新导入包 3、出现了一些意外情况像只把工程剪切而没有剪切.metadata文件等导致文件无法再次打开导致重新做 4、链接数据库时曾出现驱动失败、链接失败的问题。驱动不成功原因是,第一次导入程序出错。第二次,导入程序时路径中含有中文字符。链接失败源于connection,主要是IP地址出错 七、实习小结(在整个课程设计过程中的总结和体会); 这次的java实习,我把所学的知识综合运用到开发过程中,使我获得了许多在课本中学不到的知识。当然,在实习中也遇到了许多的困难,在老师、同学的帮助下,问题终于被解决了。通过编写、调试程序我明白了许多。第一,不应该被未知的困难吓到,一切事情只要勇于一步步去做就会成功,想想当初害怕 中原工学院信息商务学院 的要命自己就觉得好笑。第二,态度要端正,摆正自己的心态,不要以为什么东西上网搜搜就可以了,一定要有自己的东西。只有自己付出过,当程序运行成功时的那种喜悦才会令自己有一种莫名的自豪感。态度决定一切!第三,要细心,在对程序的过程中我锻炼了自己的耐力和毅力。 八、参考资料 1、邵丽萍,java语言程序设计。 2、李君芳,赵艳杰.电脑知识与技术马朝晖等.Java教程.(第4版)[M].北京:人民邮电出版社。 3、王毅.Internet与Java[J].电子与电脑。 学生姓名: 孙文琳 班级: 信息111 学号:201152275119 实验地点: 经管中心证券实验室 指导教师:赵利平实验日期: 2012.3.6 实验环境:Windows 2000+JDK1.6 1.实验目的(1)养成良好的编程风格;(2)掌握字符数据类型及其运算; (3)熟悉从输入对话框获取输入和从控制台获取输入两种方法;(4)掌握布尔运算符;(5)掌握分支语句if和switch。 2.实验内容(1)在控制台下求两个实数的最大值:完成实验教材P22程序清单2-2;(2) 3.实验过程 报告撰写具体要求:上述实验内容要求写出源代码及运行结果。实验内容(1)://CompareTwoNumbersl.java import java.util.Scanner; public class CompareTwoNumbers1{ double number1,number2; Scanner scanner; public CompareTwoNumbers1(){ System.out.println(“请输入两个数字:”); scanner=new Scanner(System.in); number1=scanner.nextDouble(); number2=scanner.nextDouble(); System.out.println(“较大的数是:”+(number1>number2?number1:number2)); } public static void main(String args[]){ CompareTwoNumbers1 ct=new CompareTwoNumbers1();System.exit(0);} } 实验内容(2): //DollarConvertor.java import java.util.Scanner;public class DollarConvertor{ public static void main(String args[]){ System.out.println(“请输入美元数:”);Scanner scanner=new Scanner(System.in);double i=scanner.nextDouble();double result=i*6.2875;System.out.println(“对应的人民币数:”+result);} } 实验内容(3): public class MultiplyList1{ public static void main(String args[]){ String output=“";for(int row=1;row<=9;row++){ for(int col=1;col<=row;col++)output+=col+”*“+row+”=“+(row*col)+” “;output+=”n";} System.out.println(output);System.exit(0);}} 4.实验总结Java程序内存泄漏研究 第3篇
Java程序混淆技术综述 第4篇
java程序设计实习报告 第5篇
Java语言程序设计实验报告1 第6篇
java程序员述职报告
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。


