昨天,在蓝杰很多同学一起讨论了反射的东西。大家你一言我一语就把我给整蒙了,一个简简单单的反射,弄得我稀里糊涂的,回寝后就在网上搜了两篇文章,看了别人写的文章,总算是有点头绪了。于是就自己写了一个小程序,测试了一下动态装载的东西。先来解释一下反射的概念,然后贴代码,看结果。
Java 反射机制是指Java程序可以在执行期载入,探知,使用编译期间完全未知的classes.这句话可能有点难以理解,我们可以通过一个例子来看。在 Java程序中我们经常会用到这样一条语句来创建一个对象。Date date = new Date();在这条语句中date的类型(Java.util.Date)在编译时已经确定。那么,有没有办法使我们把对象类型的确定时间由编译转到运行,答案是肯定的。这就是Java反射机制所提供的便利。而且它不单单可以生成对象还可以获取Field,对Field设值,及调用方法等。
谈及Java反射机制就一定要知道一个名为“Class”的类,它是Java反射机制的基础。“Class”和其它类一样继承于Object类,它的实例对象用来描述Java运行时的一种类型,接口,或者原始类型(比如 int).“Class”的实例要由JVM创建,它没有公用的构造方法。下面我们来看一下如何获得"Class"类实例。
主要有三种方法。
一,通过Class类的静态方法forName获取。Class cla = Class.forName("java.lang.String");
二,通过.Type或.class属性获得。Class cla = String.class;Class cla1 = int.Type;
三,通过实例变量的getClass方法获得。String s = ""; Class cla = s.getClass();
如上所示实例对象cla就是对String类型的描述,通过它我们就可以创建一个String实例,并调用其中的方法。
上面的某几段来自百度文库上的一片文章,写的很棒!地址点这里
下面是我写的一个例子,代码的意图是:
Computer接口:含一个方法,测试是否能开机
Dell类:继承了Computer接口,并加入了一些Dell电脑的信息
Lenove类:继承了Computer接口,并加入了一些Lenove电脑的信息
Apple类:继承了Computer接口,并加入了一些Apple电脑的信息
Selecter类:用窗口实现了一些东东
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; @Override public 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; @Override public 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后,三个电脑类还没有被编译。
弹出的窗体如下,当我输入Dell时,因为Dell类此时未被编译,所以没有.class文件,显示没有此电脑信息。
当我编译后,再次点击查询的时候就可以了,这个时候主程序是没有退出的,也就是说,这个类是被动态加载到程序中的,这是使用反射实现的。
大概的就是这些吧,要休息了,如有不完善赶明儿个再补充!
—2013年1月25日凌晨写于刘洋寝室
相关推荐
Java反射机制是Java语言的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法的信息。通过反射,我们可以在不知道具体类的情况下,动态地获取类的信息并创建对象,调用方法,修改字段值。这种机制在...
在映水苑的设计中,他运用了“反射”这一主题,不仅是物理上的水面倒影,更是对过去、未来的思考和反思。这种设计理念贯穿整个项目,体现在弯曲的塔楼、空中花园和坡屋顶等元素中,这些元素既体现了新加坡的地域特色...
request ( "helloworld.Greeter" , "SayHello" , request_data )print ( result ) # {"message":"Hellow sinsky"}特征使用反射或存根连接服务器不需要存根类请求grpc(如果需要) 支持所有一元和流方法支持tls和...
reflection_prob_refraction,天空盒折射
基于springboot大学生就业信息管理系统源码数据库文档.zip
基于java的驾校收支管理可视化平台的开题报告
时间序列 原木 间隔5秒钟 20241120
毕业设计&课设_基于 Vue 的电影在线预订与管理系统:后台 Java(SSM)代码,为毕业设计项目.zip
基于springboot课件通中小学教学课件共享平台源码数据库文档.zip
基于java的网上购物商城的开题报告
Delphi人脸检测与识别Demo1fdef-main.zip
基于java的咖啡在线销售系统的开题报告
基于java的自助医疗服务系统的开题报告.docx
内容概要:本文档全面介绍了Visual Basic(VB)编程语言的基础知识和高级应用。首先概述了VB的基本特性和开发环境,随后详细讲述了VB的数据类型、变量、运算符、控制结构、数组、过程与函数、变量作用域等内容。接着介绍了窗体设计、控件使用、菜单与工具栏的设计,文件操作、数据库访问等关键知识点。最后讨论了VB的学习方法、发展历史及其在桌面应用、Web应用、数据库应用、游戏开发和自动化脚本编写等领域的广泛应用前景。 适合人群:初学者和中级程序员,尤其是希望快速掌握Windows桌面应用开发的人群。 使用场景及目标:①掌握VB的基础语法和开发环境;②学会使用VB创建复杂的用户界面和功能完整的应用程序;③理解数据库操作、文件管理和网络编程等高级主题。 其他说明:Visual Basic是一种简单易学且功能强大的编程语言,尤其适合用于开发Windows桌面应用。文中不仅覆盖了基础知识,还包括了大量的实用案例和技术细节,帮助读者快速提升编程技能。
基于java的疫情期间高校防控系统开题报告.docx
基于springboot+vue社区老年人帮扶系统源码数据库文档.zip
基于java的超市商品管理系统的开题报告.docx
基于SpringBoot房屋买卖平台源码数据库文档.zip
xdu限通院23微处理器系统与应用大作业(两只老虎),适应于汇编语言keil软件,
<项目介绍> - 新闻类网站系统,基于SSM(Spring、Spring MVC、MyBatis)+MySQL开发,高分成品毕业设计,附带往届论文 - 不懂运行,下载完可以私聊问,可远程教学 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------