安徽工业大学java实验报告DOC.docx
《安徽工业大学java实验报告DOC.docx》由会员分享,可在线阅读,更多相关《安徽工业大学java实验报告DOC.docx(26页珍藏版)》请在冰豆网上搜索。
安徽工业大学java实验报告DOC
《Java》
课程设计报告
学号
XXX
姓名
XXX
班级
计11X
指导教师
柯栋梁
安徽工业大学计算机学院
2013年12月
实验一:
利用JAVA反射技术分析类结构
自己定义的类:
packagechap05;
publicclassanalysis{
privateinta;
privatecharc;
protectedintb;
publicdoubled;
publicvoidtest1()
{
}
privatevoidtest2()
{
}
protecteddoubletest3()
{
return1.0;
}
}
用java反射技术分析输出的结果:
Enterclassname(e.g.java.util.Date):
chap05.analysis
classchap05.analysis
{
publicchap05.analysis();
publicvoidtest1();
privatevoidtest2();
protecteddoubletest3();
privateinta;
privatecharc;
protectedintb;
publicdoubled;
}
1.分析程序运行时的输出结果。
输出的结果中显示了被分析类的方法与变量,包括这些方法与变量的修饰符
2.分析与JAVA反射技术相关的几个类的作用:
java.lang.reflect.Constructor;
Constructor提供关于类的单个构造方法的信息以及对它的访问权限。
java.lang.reflect.Field;
Field提供有关类或接口的单个字段的信息,以及对它的动态访问权限。
反射的字段可能是一个类(静态)字段或实例字段。
java.lang.reflect.Method;
Method提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。
所反映的方法可能是类方法或实例方法(包括抽象方法)。
java.lang.reflect.Modifier;
Modifier类提供了static方法和常量,对类和成员访问修饰符进行解码。
修饰符集被表示为整数,用不同的位位置(bitposition)表示不同的修饰符。
实验二:
利用JAVA反射技术分析对象结构
实验内容:
运行示例程序,分析Integer数组对象的结构;改写程序分析一下自定义
的类对象,如Employee类。
结果分析:
该程序较为复杂,通过调试模式我发现ObjectAnalyzer的toString方法为一递归函数,从代码可以看出程序是用来分析对象中非静态的成员变量并将其显示出来,通过递归分析对象中的对象的成员变量,通过获取超类分析其继承来的成员变量。
自己编的类:
packagechap05;
publicclassanalysisextendsEmployee{
privateinta=0;
privatecharc='';
staticprotectedintb=0;
publicdoubled=0;
publicvoidtest1()
{
}
privatevoidtest2()
{
}
protecteddoubletest3()
{
return1.0;
}
}
分析结果:
chap05.analysis[a=0,c=,d=0.0][][salary=0.0,name=null,year=0,mouth=0,day=0][]
实验三:
利用JAVA反射技术调用方法指针
定义的People类:
packagechap05;
publicabstractclassPeople{
doublesalary;
Stringname;
intyear,mouth,day;
publicabstractdoublegetSalary();
publicabstractvoidsetSalary(doublesalary);
}
classEmployeeextendsPeople{
Employee(Stringname,doublesalary,intyear,intmouth,intday){
this.salary=salary;
this.name=name;
this.year=year;
this.mouth=mouth;
this.day=day;
}
Employee(){
}
publicdoublegetSalary(){
returnsalary;
}
publicvoidsetSalary(doublesalary){
this.salary=salary;
}
}
classManagerextendsPeople{
privatedoublebonus;
Manager(Stringname,doublesalary,intyear,intmouth,intday){
this.salary=salary;
this.name=name;
this.year=year;
this.mouth=mouth;
this.day=day;
bonus=0;
}
publicdoublegetSalary(){
returnsalary+bonus;
}
publicvoidsetSalary(doublesalary){
this.salary=salary;
}
publicvoidsetBonus(doublebonus){
this.bonus=bonus;
}
}
通过指针调用的结果:
publicstaticdoublechap05.MethodPointerTest.square(double)
9.0
publicstaticdoublejava.lang.Math.sqrt(double)
3.0
publicdoublechap05.Employee.getSalary()
50000.0
publicvoidchap05.Manager.setBonus(double)
publicdoublechap05.Manager.getSalary()
80000.0
3.结果分析:
1.分析程序运行时的输出结果。
代码中Methodl类就相当于一个指向类中方法的指针,Class类通过getMethod方法获取这个Method类,之后Method类的对象可以通过invoke方法来调用这个方法。
2.掌握反射技术调用类(对象)方法的基本原理与流程。
(同上)
4.扩展:
1.自定义一些简单类,使用反射技术调用该类(静态方法)或类对象的方法;
packagechap05;
importjava.lang.reflect.*;
publicclassMethodPointertest2{
publicstaticvoidmain(String[]args)throwsException{
Methodsin=Math.class.getMethod("sin",double.class);
FieldPI=Math.class.getField("PI");
System.out.println(sin.invoke(null,PI.getDouble(null)/2));
}
}
输出结果:
1.0
这里没有再自己定义方法了,这里类比Method方法的使用过程通过Field方法获取了Math类里的PI成员并使用
2.对于未知类(对象)的内部结构,如何利用反射技术调用其方法?
可以先通过反射技术分析其结构再通过反射技术调用其方法。
实验四:
利用TreeSet实现集合元素排序
源代码:
packageshiyan04;
importjava.util.*;
publicclassEmployeeimplementsComparable{
publicStringname;
publicintsalary;
publicDatehiredate=newDate();
Employee(Stringname,intsalary,Datehiredate)
{
this.name=name;
this.salary=salary;
this.hiredate.setTime(hiredate.getTime());
}
publicintcompareTo(Employeeother)
{
returnpareTo(other.name);
}
}
classsalaryComparatorimplementsComparator
{
publicintcompare(Employeea,Employeeb)
{
returna.salary-b.salary;
}
}
packageshiyan04;
importjava.text.SimpleDateFormat;
importjava.util.*;
publicclassProcess{
publicstaticvoidmain(String[]args){
Employee[]e=newEmployee[10];
DatenowTime=newDate();
SimpleDateFormatformat=newSimpleDateFormat("yyyy-MM-dd");
String[]name={"张三","李四","王五","赵六","Tom","Jerry","Amy",
"test","Jack","John"};
longoneday=86400000;
//System.out.println(nowTime);
for(inti=0;i<10;i++){
nowTime.setTime(nowTime.getTime()-oneday*30);
e[i]=newEmployee(name[i],3000+i*100,nowTime);
}
System.out.println("按姓名:
");
SortedSetbyname=newTreeSet();
for(Employeei:
e){
byname.add(i);
}
Iteratoriter=byname.iterator();
while(iter.hasNext()){
Employeee1=iter.next();
System.out.println(e1.name+""+e1.salary+""
+format.format(e1.hiredate));
}
System.out.println("按工资:
");
salaryComparatorcomp2=newsalaryComparator();
SortedSetbysalary=newTreeSet(comp2);
for(Employeei:
e){
bysalary.add(i);
}
iter=bysalary.iterator();
while(iter.hasNext()){
Employeee1=iter.next();
System.out.println(e1.name+""+e1.salary+""
+format.format(e1.hiredate));
}
System.out.println("按日期:
");
SortedSetbydate=newTreeSet(
newComparator(){
publicintcompare(Employeea,Employeeb){
returnpareTo(b.hiredate);
}
});
for(Employeei:
e){
bydate.add(i);
}
iter=bydate.iterator();
while(iter.hasNext()){
Employeee1=iter.next();
System.out.println(e1.name+""+e1.salary+""
+format.format(e1.hiredate));
}
}
}
运行结果:
按姓名:
Amy36002013-05-28
Jack38002013-03-29
Jerry35002013-06-27
John39002013-02-27
Tom34002013-07-27
test37002013-04-28
张三30002013-11-24
李四31002013-10-25
王五32002013-09-25
赵六33002013-08-26
按工资:
张三30002013-11-24
李四31002013-10-25
王五32002013-09-25
赵六33002013-08-26
Tom34002013-07-27
Jerry35002013-06-27
Amy36002013-05-28
test37002013-04-28
Jack38002013-03-29
John39002013-02-27
按日期:
John39002013-02-27
Jack38002013-03-29
test37002013-04-28
Amy36002013-05-28
Jerry35002013-06-27
Tom34002013-07-27
赵六33002013-08-26
王五32002013-09-25
李四31002013-10-25
张三30002013-11-24
实验五:
多线程同步之团结就是力量实验
源代码:
packagechap08;
importjava.util.Random;
publicclassExCooperation2{
publicstaticvoidmain(String[]args){
WorkStudent2ws1=newWorkStudent2(1,10);
WorkStudent2ws2=newWorkStudent2(2,20);
WorkStudent2ws3=newWorkStudent2(3,30);
WorkStudent2ws4=newWorkStudent2(4,40);
newThread(ws1).start();
newThread(ws2).start();
newThread(ws3).start();
newThread(ws4).start();
}
}
classDeskAndChair{
int[]desk={0,0,0,0,0},chair={0,0,0,0,0};
privateintchairCount=500;
privateintdeskCount=500;
publicsynchronizedBooleandistribute(intid,longsleeptime){
intchairs=1;
intdesks=1;
Randomrdm=newRandom(System.currentTimeMillis());
if(rdm.nextInt()%2==0){
if(chairCount>0)
{
chairs=chairs-1;
while(chairs<0)
{
try
{
wait();
}catch(InterruptedExceptione)
{
}
}
System.out.println("Student"+id+":
wipingdesk"+chairCount--);
chair[id]+=1;
chairs=chairs+1;
notifyAll();
}
}
else
{
if(deskCount>0)
{
desks=desks-1;
while(desks<0)
{
try
{
wait();
}catch(InterruptedExceptione)
{
}
}
System.out.println("Student"+id+":
wipingdesk"+deskCount--);
desk[id]+=1;
desks=desks+1;
notifyAll();
}
}
if(chairCount==0&&deskCount==0)
returntrue;
else
returnfalse;
}
}
classWorkStudent2implementsRunnable{
privatelongsleeptime;
privateintid;
staticDeskAndChairdc=newDeskAndChair();
publicWorkStudent2(intid,longtime){
super();
this.id=id;
this.sleeptime=time;
}
publicvoidrun(){
while(!
dc.distribute(id,sleeptime))
{
try
{
Thread.sleep(sleeptime);
}
catch(Exceptione)
{
}
};
System.out.println("Result:
Student"+id+"wiped"+dc.desk[id]+"desksand"+dc.chair[id]+"chairs.");
}
}
运行结果:
实验六:
利用JDBC技术实现简易MYSQL客户端程序
1.工具:
(2)数据库软件:
MicrosoftAccess2010
(3)Java开发工具:
Eclipse
2.程序框图:
2.部分运行截图及源代码:
数据库表:
1.主界面代码:
classMyPanelextendsJPanel{
Imageimg=Toolkit.getDefaultToolkit().getImage("c:
/a.jpg");
publicvoidpaint(Graphicsg){
g.drawImage(img,0,0,this);
}
}
publicclassMainFormextendsJFrameimplementsActionListener
{
JMenumSystem=newJMenu("系统");
JMenuItemmExit=newJMenuItem("退出");
JMenumOperate=newJMenu("数据操作");
JMenuItemmAdd=newJMenuItem("添加成绩表中的数据");
JMenuItemmDel=newJMenuItem("删除成绩表中的数据");
JMenuItemmModify=newJMenuItem("修改成绩表中的数据");
JMenumQuery=newJMenu("查询");
JMenuItemmName=newJMenuItem("在成绩表中按姓名查询");
JMenuItemmScore=newJMenuItem("在成绩表中按成绩查询");
JMenuItemmBname=newJMenuItem("在班级表中按班级名查询");
JMenuItemmBscore=newJMenuItem("在班级表中按班级平均成绩查询");
JMenumHelp=newJMenu("帮助");
JMenuItemmAbout=newJMenuItem("系统信息");
JMenuBarmBar=newJMenuBar();
MainForm()
{
super("学生成绩管理系统");
setSize(680,640);
mSystem.add(mExit);
mOperate.add(mAdd);
mOperate.add(mDel);
mOperate.add(mModify);
mQuery.add(mName);
mQuery.add(mScore);
mQuery.add(mBname);
mQuery.add(mBscore);
mHelp.add(mAbout);
mBar.add(mSystem);
mBar.add(mOperate);
mBar.add(m