读书人

反照(Reflaction)初探

发布时间: 2013-01-28 11:49:56 作者: rapoo

反射(Reflaction)初探
public interface Computer {//在这个接口中定义方法public String startScreen();//开机的方法}

?

public class Dell implements Computer {private String operatingSystem = "Windows7";private int prize = 4500;private int hardMemory = 320;private int Memory = 2;public String startScreen() {return "Dell is OK!";}}

?

public class Apple implements Computer{private String operatingSystem = "IOS";private int prize = 7000;private int hardMemory = 500;private int Memory = 4;@Overridepublic String startScreen() {return "Apple is OK!";}}

?

public class Lenove implements Computer {private String operatingSystem = "Windows XP";private int prize = 5000;private int hardMemory = 500;private int Memory = 2;@Overridepublic String startScreen() {return "Lenove is OK!";}}

?

import java.awt.Dimension;import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.lang.reflect.Field;import java.lang.reflect.Method;import javax.swing.JButton;import javax.swing.JDialog;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.UIManager;public class Selecter extends JFrame {JTextArea area;private void initFrame() {this.setName("电脑信息查询");this.setLayout(new FlowLayout());this.setSize(new Dimension(340, 400));this.setLocationRelativeTo(null);this.setDefaultCloseOperation(3);JLabel lable = new JLabel("查询的电脑:");final JTextField text = new JTextField(13);JButton button1 = new JButton("查询");JButton button2 = new JButton("测试");area = new JTextArea();JScrollPane scrollpane = new JScrollPane(area);scrollpane.setPreferredSize(new Dimension(290, 290));this.add(lable);this.add(text);this.add(button1);this.add(button2);this.add(scrollpane);this.setVisible(true);// 设置窗体可见// 给按钮1添加监听器button1.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {String text1 = text.getText();getDescription(text1);}});// 给按钮2添加监听器button2.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {String text2 = text.getText();Computer com = (Computer) getComputer(text2);testComputer(com, "startScreen");}});}// 得到所查询电脑的详细信息public void getDescription(String type) {try {Class cla = Class.forName(type);// 生成一个实例对象,在编译时我们并不知道obj是什么类型Object obj = cla.newInstance();// 获得type类型所有已定义类变量及方法。Field[] fileds = cla.getDeclaredFields();area.append(cla.getSimpleName()+"电脑的详细信息是:\n");for (int i = 0; i < fileds.length; i++) {fileds[i].setAccessible(true);// 输出类变量的定义及obj实例中对应的值area.append(fileds[i].getName() + ":" + fileds[i].get(obj) + "\n");}area.append("\n");} catch (Exception e) {area.append("对不起,没有这种电脑的信息!\n\n");}}// 使用电脑的某个功能public void testComputer(Object obj, String function) {try {Class cla = obj.getClass();// 获得cla类中定义的无参方法。Method m = cla.getMethod(function, null);// 调用obj中名为function的无参方法。String aa= (String)m.invoke(obj, null);area.append(aa+"\n\n");} catch (Exception e) {}}// 拿电脑给顾客public Object getComputer(String type) {try {Class cla = Class.forName(type);Object obj = cla.newInstance();return obj;} catch (Exception e) {area.append("对不起,没有这种电脑的信息!\n\n");return null;}}public static void main(String[] args) {/*************** 以下几句是优化窗体界面的方法 ***************************/JFrame.setDefaultLookAndFeelDecorated(true); // 加上此语句连同窗体外框也改变JDialog.setDefaultLookAndFeelDecorated(true); // 加上此语句会使弹出的对话框也改变try {UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");} catch (Exception e) {e.printStackTrace();}/*************** 以上几句是优化窗体界面的方法 ***************************/Selecter selecter = new Selecter();selecter.initFrame();}}

?

???? 当我输入使用控制台编译Selecter后,三个电脑类还没有被编译。

?

反照(Reflaction)初探?反照(Reflaction)初探

?

?????? 弹出的窗体如下,当我输入Dell时,因为Dell类此时未被编译,所以没有.class文件,显示没有此电脑信息。

?????? 当我编译后,再次点击查询的时候就可以了,这个时候主程序是没有退出的,也就是说,这个类是被动态加载到程序中的,这是使用反射实现的。

?

反照(Reflaction)初探?反照(Reflaction)初探
反照(Reflaction)初探?反照(Reflaction)初探
?

?大概的就是这些吧,要休息了,如有不完善赶明儿个再补充!

—2013年1月25日凌晨写于刘洋寝室

?

读书人网 >编程

热点推荐