安徽工业大学——java实验报告

   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编程不熟悉,所以在编程中出现很多的错误,最后通过自己查询资料以及和同学的探讨得以解决。

相关推荐