JAVE实验报告
安徽工业大学计算机学院
20##年1月
实验一: 利用 JAVA 反射技术分析类结构
自己定义的类:
package chap05;
publicclass analysis {
privateinta;
privatecharc;
protectedint b;
publicdouble d;
publicvoid test1()
{
}
privatevoidtest2()
{
}
protecteddouble test3()
{
return 1.0;
}
}
用java反射技术分析输出的结果:
Enter class name (e.g. java.util.Date):
chap05.analysis
class chap05.analysis
{
public chap05.analysis();
public void test1();
private void test2();
protected double test3();
private int a;
private char c;
protected int b;
public double d;
}
1.分析程序运行时的输出结果。
输出的结果中显示了被分析类的方法与变量,包括这些方法与变量的修饰符
2.分析与JAVA反射技术相关的几个类的作用:
java.lang.reflect.Constructor;
Constructor 提供关于类的单个构造方法的信息以及对它的访问权限。
java.lang.reflect.Field;
Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。
java.lang.reflect.Method;
Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。
java.lang.reflect.Modifier;
Modifier 类提供了 static 方法和常量,对类和成员访问修饰符进行解码。修饰符集被表示为整数,用不同的位位置 (bit position) 表示不同的修饰符。
实验二 :利用 JAVA 反射技术分析对象结构
实验内容:运行示例程序,分析 Integer 数组对象的结构;改写程序分析一下自定义
的类对象,如 Employee 类。
结果分析:
该程序较为复杂,通过调试模式我发现ObjectAnalyzer的toString方法为一递归函数,从代码可以看出程序是用来分析对象中非静态的成员变量并将其显示出来,通过递归分析对象中的对象的成员变量,通过获取超类分析其继承来的成员变量。
自己编的类:
package chap05;
publicclass analysis extends Employee{
privateinta = 0;
privatecharc = ' ';
staticprotectedintb = 0;
publicdouble d = 0;
publicvoid test1()
{
}
privatevoidtest2()
{
}
protecteddouble test3()
{
return 1.0;
}
}
分析结果:
chap05.analysis[a=0,c= ,d=0.0][][salary=0.0,name=null,year=0,mouth=0,day=0][]
实验三: 利用 JAVA 反射技术调用方法指针
定义的People类:
package chap05;
publicabstractclass People {
double salary;
String name;
int year,mouth,day;
publicabstractdouble getSalary();
publicabstractvoid setSalary(double salary);
}
class Employee extends People{
Employee(String name,double salary,int year,int mouth,int day){
this.salary = salary;
this.name = name;
this.year = year;
this.mouth = mouth;
this.day = day;
}
Employee(){
}
publicdouble getSalary(){
return salary;
}
publicvoid setSalary(double salary){
this.salary = salary;
}
}
class Manager extends People{
privatedouble bonus;
Manager(String name,double salary,int year,int mouth,int day){
this.salary = salary;
this.name = name;
this.year = year;
this.mouth = mouth;
this.day = day;
bonus= 0;
}
publicdouble getSalary(){
return salary+bonus;
}
publicvoid setSalary(double salary){
this.salary = salary;
}
publicvoid setBonus(double bonus){
this.bonus = bonus;
}
}
通过指针调用的结果:
public static double chap05.MethodPointerTest.square(double)
9.0
public static double java.lang.Math.sqrt(double)
3.0
public double chap05.Employee.getSalary()
50000.0
public void chap05.Manager.setBonus(double)
public double chap05.Manager.getSalary()
80000.0
3.结果分析:
1.分析程序运行时的输出结果。
代码中Methodl类就相当于一个指向类中方法的指针,Class类通过getMethod方法获取这个Method类,之后Method类的对象可以通过invoke方法来调用这个方法。
2.掌握反射技术调用类(对象)方法的基本原理与流程。
(同上)
4.扩展:
1.自定义一些简单类,使用反射技术调用该类(静态方法)或类对象的方法;
package chap05;
import java.lang.reflect.*;
publicclass MethodPointertest2 {
publicstaticvoid main(String[] args) throws Exception{
Method sin = Math.class.getMethod("sin",double.class);
Field PI = Math.class.getField("PI");
System.out.println(sin.invoke(null, PI.getDouble(null)/2));
}
}
输出结果:1.0
这里没有再自己定义方法了,这里类比Method方法的使用过程通过Field方法获取了Math类里的PI成员并使用
2.对于未知类(对象)的内部结构,如何利用反射技术调用其方法?
可以先通过反射技术分析其结构再通过反射技术调用其方法。
实验四: 利用 TreeSet 实现集合元素排序
源代码:
package shiyan04;
import java.util.*;
publicclass Employee implements Comparable<Employee>{
public String name;
publicint salary;
public Date hiredate = new Date();
Employee(String name,int salary,Date hiredate)
{
this.name = name;
this.salary = salary;
this.hiredate.setTime(hiredate.getTime());
}
publicint compareTo(Employee other)
{
return name.compareTo(other.name);
}
}
class salaryComparator implements Comparator<Employee>
{
publicint compare(Employee a,Employee b)
{
return a.salary - b.salary;
}
}
package shiyan04;
import java.text.SimpleDateFormat;
import java.util.*;
public class Process {
public static void main(String[] args) {
Employee[] e = new Employee[10];
Date nowTime = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String[] name = { "张三", "李四", "王五", "赵六", "Tom", "Jerry", "Amy",
"test", "Jack", "John" };
long oneday = 86400000;
// System.out.println(nowTime);
for (int i = 0; i < 10; i++) {
nowTime.setTime(nowTime.getTime() - oneday * 30);
e[i] = new Employee(name[i], 3000 + i * 100, nowTime);
}
System.out.println("按姓名:");
SortedSet<Employee> byname = new TreeSet<Employee>();
for (Employee i : e) {
byname.add(i);
}
Iterator<Employee> iter = byname.iterator();
while (iter.hasNext()) {
Employee e1 = iter.next();
System.out.println(e1.name + " " + e1.salary + " "
+ format.format(e1.hiredate));
}
System.out.println("按工资:");
salaryComparator comp2 = new salaryComparator();
SortedSet<Employee> bysalary = new TreeSet<Employee>(comp2);
for (Employee i : e) {
bysalary.add(i);
}
iter = bysalary.iterator();
while (iter.hasNext()) {
Employee e1 = iter.next();
System.out.println(e1.name + " " + e1.salary + " "
+ format.format(e1.hiredate));
}
System.out.println("按日期:");
SortedSet<Employee> bydate = new TreeSet<Employee>(
new Comparator<Employee>() {
public int compare(Employee a, Employee b) {
return a.hiredate.compareTo(b.hiredate);
}
});
for (Employee i : e) {
bydate.add(i);
}
iter = bydate.iterator();
while (iter.hasNext()) {
Employee e1 = iter.next();
System.out.println(e1.name + " " + e1.salary + " "
+ format.format(e1.hiredate));
}
}
}
运行结果:
按姓名:
Amy 3600 20##-05-28
Jack 3800 20##-03-29
Jerry 3500 20##-06-27
John 3900 20##-02-27
Tom 3400 20##-07-27
test 3700 20##-04-28
张三 3000 20##-11-24
李四 3100 20##-10-25
王五 3200 20##-09-25
赵六 3300 20##-08-26
按工资:
张三 3000 20##-11-24
李四 3100 20##-10-25
王五 3200 20##-09-25
赵六 3300 20##-08-26
Tom 3400 20##-07-27
Jerry 3500 20##-06-27
Amy 3600 20##-05-28
test 3700 20##-04-28
Jack 3800 20##-03-29
John 3900 20##-02-27
按日期:
John 3900 20##-02-27
Jack 3800 20##-03-29
test 3700 20##-04-28
Amy 3600 20##-05-28
Jerry 3500 20##-06-27
Tom 3400 20##-07-27
赵六 3300 20##-08-26
王五 3200 20##-09-25
李四 3100 20##-10-25
张三 3000 20##-11-24
实验五: 多线程同步之团结就是力量实验
源代码:
package chap08;
import java.util.Random;
publicclass ExCooperation2 {
publicstaticvoid main(String[] args) {
WorkStudent2 ws1 = new WorkStudent2(1, 10);
WorkStudent2 ws2 = new WorkStudent2(2, 20);
WorkStudent2 ws3 = new WorkStudent2(3, 30);
WorkStudent2 ws4 = new WorkStudent2(4, 40);
new Thread(ws1).start();
new Thread(ws2).start();
new Thread(ws3).start();
new Thread(ws4).start();
}
}
class DeskAndChair{
int[] desk={0,0,0,0,0},chair={0,0,0,0,0};
privateint chairCount = 500;
privateint deskCount = 500;
publicsynchronized Boolean distribute(int id,long sleeptime){
int chairs = 1;
int desks = 1;
Random rdm = new Random(System.currentTimeMillis());
if(rdm.nextInt() % 2 ==0){
if(chairCount > 0)
{
chairs = chairs - 1;
while(chairs<0)
{
try
{
wait();
}catch(InterruptedException e)
{
}
}
System.out.println("Student "+id+": wiping desk "+chairCount--);
chair[id]+=1;
chairs = chairs + 1;
notifyAll();
}
}
else
{
if(deskCount > 0)
{
desks = desks - 1;
while(desks<0)
{
try
{
wait();
}catch(InterruptedException e)
{
}
}
System.out.println("Student "+id+": wiping desk "+deskCount--);
desk[id]+=1;
desks = desks + 1;
notifyAll();
}
}
if(chairCount == 0&&deskCount == 0)
returntrue;
else
returnfalse;
}
}
class WorkStudent2 implements Runnable {
privatelong sleeptime;
privateint id;
static DeskAndChair dc = new DeskAndChair();
public WorkStudent2(int id,long time){
super();
this.id=id;
this.sleeptime=time;
}
publicvoid run(){
while(!dc.distribute(id, sleeptime))
{
try
{
Thread.sleep(sleeptime);
}
catch(Exception e)
{
}
};
System.out.println("Result: Student "+id+" wiped "+dc.desk[id]+" desks and"+dc.chair[id]+" chairs.");
}
}
运行结果:
实验六: 利用 JDBC 技术实现简易 MYSQL 客户端程序
1.工具:
(2)数据库软件:Microsoft Access 2010
(3)Java开发工具:Eclipse
2.程序框图:
2.部分运行截图及源代码:
数据库表:
1.主界面代码:
classMyPanelextends JPanel{
Image img=Toolkit.getDefaultToolkit().getImage("c:/a.jpg");
publicvoid paint(Graphics g){
g.drawImage(img,0,0,this);
}
}
publicclassMainFormextends JFrame implements ActionListener
{
JMenu mSystem=new JMenu("系统");
JMenuItem mExit=new JMenuItem("退出");
JMenu mOperate=new JMenu("数据操作");
JMenuItem mAdd=new JMenuItem("添加成绩表中的数据");
JMenuItem mDel=new JMenuItem("删除成绩表中的数据");
JMenuItem mModify=new JMenuItem("修改成绩表中的数据");
JMenu mQuery=new JMenu("查询");
JMenuItem mName=new JMenuItem("在成绩表中按姓名查询");
JMenuItem mScore=new JMenuItem("在成绩表中按成绩查询");
JMenuItem mBname=new JMenuItem("在班级表中按班级名查询");
JMenuItem mBscore=new JMenuItem("在班级表中按班级平均成绩查询");
JMenu mHelp=new JMenu("帮助");
JMenuItem mAbout=new JMenuItem("系统信息");
JMenuBar mBar=new JMenuBar();
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(mQuery);
mBar.add(mHelp);
setJMenuBar(mBar);
mExit.addActionListener(this);
mAdd.addActionListener(this);
mDel.addActionListener(this);
mModify.addActionListener(this);
mName.addActionListener(this);
mScore.addActionListener(this);
mBname.addActionListener(this);
mBscore.addActionListener(this);
mAbout.addActionListener(this);
setContentPane(new MyPanel());
setVisible(true);
}
publicvoid actionPerformed(ActionEvent ae){
if(ae.getSource()==mExit)
System.exit(0);
elseif(ae.getSource()==mAbout)
JOptionPane.showMessageDialog(this,"学生成绩管理系统\n\n计算机学院\n\n20##年12月","系统信息",JOptionPane.INFORMATION_MESSAGE);
elseif(ae.getSource()==mAdd)
new AddForm().setVisible(true);
elseif(ae.getSource()==mDel)
new DeleteForm().setVisible(true);
elseif(ae.getSource()==mModify)
new ModifyForm().setVisible(true);
elseif(ae.getSource()==mName)
new NameQueryForm().setVisible(true);
elseif(ae.getSource()==mScore)
new ScoreQueryForm().setVisible(true);
elseif(ae.getSource()==mBname)
new BnameQueryForm().setVisible(true);
elseif(ae.getSource()==mBscore)
new BsoreQueryForm().setVisible(true);
}
publicstaticvoid main(String[] args) {
new MainForm();
}
}
2.添加数据:
3.修改数据:
如果没有该数据:
4.删除数据:
注:限于篇幅部分功能没有截图。
实验体会:
从本次课程设计中我对于Java编程有了更深刻的认识,了解了如何使用编程软件eclipse,如何根据要求编写一些简单的程序(大的程序的编写还是比较麻烦),以及如何使用一些基本的方法等,还有如何利用Java语言从数据库中查找,添加,删除特定的数据。 当然,在程序设计中也遇到了很多的问题,由于能力有限以及对于Java编程不熟悉,所以在编程中出现很多的错误,最后通过自己查询资料以及和同学的探讨得以解决。
河南省高等教育自学考试实验报告册计算机及应用专业(本科段)《JAVA》姓名所属地市实验地点实验日期实验总成绩指导教师签名实验单位(…
五子棋JAVA实验报告一实验目的和要求1能够用编程语言实现一个简单的五子棋程序2在实际系统中使用实现人工智能的相关算法3进一步加深…
信息工程学院Java程序设计实习报告JAVA图形用户界面实验六Java图形用户界面1实验目的1掌握图形用户界面基本组件2了解如何使…
北京联合大学信息学院“面向对象程序设计”课程上机实验报告题目:JAVA上机实验心得体会姓名(学号):专业:计算机科学与技术编制时间…
Java语言程序设计实验报告实验序号3一实验目的及要求1进一步熟练Java语法和常用方法的使用2进一步熟练Java程序结构3进一步…
北京联合大学信息学院“面向对象程序设计”课程上机实验报告题目:JAVA上机实验心得体会姓名(学号):专业:计算机科学与技术编制时间…
Homework3实验报告一实验目的与要求1掌握Java中类和接口的基本知识2继承的基本知识3集合的基本操作二实验内容1PIMCo…
浙江理工大学Java程序设计实验报告20xx20xx学年第二学期学院班级姓名学号任课教师信息学院11数字媒体技术2周咪咪20xx3…
Java课程设计报告学号姓名班级指导教师129074068叶玉虎计122班柯栋梁安徽工业大学计算机学院20xx年12月实验一利用J…
学生实验报告册(理工类)课程名称:JAVA程序设计实验专业班级:M11计算机科学与技术II学生学号:学生姓名:所属院部:XX学院指…
JAVA实训总结XXX班XXX这个学期的最后两周是学校安排的Java实训课程,主要地点是在机房,这次我们任务是作一个网吧计费管理系…