Answer: Yes. The following code shows that one may read an object
from a file (in this case a Hashtable object) and use class Class and
class Method to invoke the get method without type casting.
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;
import java.lang.reflect.*;
class FileOps4 {
File4 f4;
FileOps4 (File4 f4) {
this.f4 = f4;
}
void readFromFile (String filename) {
try {
FileInputStream fis = new FileInputStream (filename);
ObjectInputStream ois = new ObjectInputStream(fis);
Object h = ois.readObject();
Class c = h.getClass();
Method m = c.getMethod("get",
new Class[] { (new Object()).getClass()});
Object obj = m.invoke(h, new Object[]{ new String("one") });
System.out.print("Hashtable: ["+obj.toString()+"]");
obj = m.invoke(h, new Object[]{ new String("two") });
System.out.print(" ["+obj.toString()+"]");
obj = m.invoke(h, new Object[]{ new String("three") });
System.out.print(" ["+obj.toString()+"]");
System.out.println();
f4.text.setText(h.toString()+"\n");
Vector v = (Vector)ois.readObject();
f4.text.append(v.toString()+"\n");
fis.close();
}
catch (IOException e) {
f4.messages.setText("File "+filename+" Not Found");
}
catch (Exception ee) {
f4.messages.setText("Error: "+ee);
}
}
public void writeToFile(String filename) {
Hashtable h = new Hashtable();
h.put("one", new String("Hello There"));
h.put("two", new Integer(23));
h.put("three", new Double(1.23));
Vector v = new Vector();
v.addElement(new String("Goodbye"));
v.addElement(new Integer(43));
v.addElement(new Double(4.34));
v.addElement(h);
try {
FileOutputStream fos = new FileOutputStream (filename);
ObjectOutputStream out = new ObjectOutputStream(fos);
out.writeObject(h);
out.writeObject(v);
fos.close();
}
catch (IOException e) {
f4.messages.setText("Could not write to "+filename);
}
}
}
public class File4 extends Applet implements ActionListener {
JTextArea text;
JTextField filename, messages, delimiter, number;
JButton read, write;
FileOps4 fo;
public void init () {
setLayout(new BorderLayout());
Panel p = new Panel();
p.setLayout(new GridLayout(2,1));
Panel q = new Panel();
q.setLayout(new BorderLayout());
Panel r = new Panel();
r.setLayout(new GridLayout(2,1));
r.add(filename = new JTextField());
r.add(new JLabel("Filename", JLabel.CENTER));
q.add("Center", r);
r = new Panel();
r.setLayout(new GridLayout(2,1));
r.add(new JLabel(""));
r.add(new JLabel(""));
q.add("East",r);
p.add(q);
q = new Panel();
q.setLayout(new BorderLayout());
r = new Panel();
r.setLayout(new GridLayout(2,1));
r.add(messages = new JTextField());
r.add(new JLabel("Messages", JLabel.CENTER));
q.add("Center", r);
r = new Panel();
r.setLayout(new GridLayout(2,1));
r.add(new JLabel(""));
r.add(new JLabel(""));
q.add("East", r);
p.add(q);
add ("North", p);
add ("Center", new JScrollPane(text = new JTextArea(30,30)));
p = new Panel();
p.setLayout(new GridLayout(1,3));
p.add(read = new JButton("Read"));
p.add(new JLabel());
p.add(write = new JButton("Write"));
add ("South", p);
}
public void start () {
fo = new FileOps4(this);
read.addActionListener(this);
write.addActionListener(this);
}
public void actionPerformed (ActionEvent evt) {
if (evt.getSource() == read)
fo.readFromFile(filename.getText());
else
if (evt.getSource() == write)
fo.writeToFile(filename.getText());
}
}