昨天,在蓝杰很多同学一起讨论了反射的东西。大家你一言我一语就把我给整蒙了,一个简简单单的反射,弄得我稀里糊涂的,回寝后就在网上搜了两篇文章,看了别人写的文章,总算是有点头绪了。于是就自己写了一个小程序,测试了一下动态装载的东西。先来解释一下反射的概念,然后贴代码,看结果。
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,天空盒折射
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1. 用户角色 管理员 药店员工/药师 客户 2. 功能描述 管理员功能 用户管理 创建、编辑和删除药店员工和药师的账户。 设置不同用户的权限,确保敏感信息的安全。 库存管理 实时监控药品库存状态,设置库存预警,防止缺货或过期。 支持药品入库、出库和退货记录,自动更新库存数量。 商品管理 添加、编辑和删除药品信息,包括名称、规格、价格、生产厂家、有效期等。 分类管理药品,如处方药、非处方药、保健品等。 销售管理 查看和管理销售记录,生成每日、每周和每月的销售报表。 分析销售数据,了解畅销产品和季节性变化,以优化库存。 财务管理 监控药店的收入与支出,并生成财务报表。 管理支付方式(现金、信用卡、电子支付)及退款流程。 客户管理 记录客户的基本信息和购买历史,提供个性化服务。 管理会员制度,设置积分和优惠活动。 药品监管符合性 确保药店遵循相关法规,跟踪药品的进货渠道和销售记录。 提供合规报告,确保按规定进行药品管理。 报告与分析 生成各类统计报表,包括销售分析、库存分析和客户行为分析。 提供决策支持,帮助制定更好的经营策略。 药店员工/药师功能 销售操作 处理顾客的药
Matlab领域上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
今天吴老师上课的时候说我.txt
检测骨架图像的交点Matlab代码.rar
MMC simulink 模块化多电平变流器 载波移相 双闭环仿真 输出谐波分析,线性自抗扰控制LADRC 有仿真文件
自动驾驶控制-斯坦利(stanely)算法路径跟踪仿真 matlab和carsim联合仿真搭建的无人驾驶斯坦利控制器仿真验证,可以实现双移线,圆形,以及其他自定义的路径跟踪。 跟踪效果如图,几乎没有误差,跟踪误差在0.05m以内。
TongRDS是redis的国产化替代品之一,里面含有相应的安装部署包及操作流程,详细介绍TongRDS的基本部署和基本开发使用。
基于mpvue实现豆瓣电影微信小程序@zce_mpvue-Douban
隔离型DCDC变器设计,LLC谐振变器闭环仿真,变频控制。 有自己做的对应明 ,十分详细。
Delphi in Depth - FireDAC.rar
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
ShellBox微信小程序,集日程查询、成绩查询、电费查询、图书查询等功能于一体的高校微信小软件_ShellBox
Java小程序项目源码,该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:小程序 后端框架:SSM/SpringBoot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
微信小程序校园微社区_ zafuBBS