(浅谈)Java反射机制的使用
2017-12-16 17:48
417 查看
在学习J2ee开发框架的时候总能听说反射机制,比如spring框架,Aop中的动态代理等,就在网上查找了很多关于反射的文章,每篇文章中都会关于反射机制有大量的解释,看过之后觉得明白很多,但是还是有很多说不出来的疑惑,直到给同学讲解反射的时候,她问:我们正常写代码的时候哪里用的上反射。我才觉得我在编写的程序时很难想到用反射区编写,所以我就写了一个小例子,希望对有同样疑惑的人有帮助。
我就拿最简单的加减乘除计算器举例正常我们写意个计算类
public class jisuan { private int num1; private int num2; public int getNum1() { return num1; } public void setNum1(int num1) { this.num1 = num1; } public int getNum2() { return num2; } public void setNum2(int num2) { this.num2 = num2; } public String getOperater() { return operater; } public void setOperater(String operater) { this.operater = operater; } private String operater; public int add(){ System.out.println("diaoyong add"); return num1+num2; } public int sub(){ System.out.println("diaoyong sub"); return num1+num2; } public int cheng(){ System.out.println("diaoyong cheng"); return num1*num2; } public int chu(){ System.out.println("diaoyong chu"); if(num2!=0){ return num1/num2; }else return 0; } }再编写一个主程序调用
public class Test{ public static void main(String[]args){ jisuan test=new jisuan(); Scanner sc=new Scanner(System.in); System.out.println("请输入第一个数"); int num1=Integer.parseInt(sc.nextLine()); test.setNum1(num1); System.out.println("请输入第二个数"); int num2=Integer.parseInt(sc.nextLine()); test.setNum2(num2); System.out.println("请输入运算符"); String operter=sc.nextLine(); switch (operter){ case "add": System.out.println(test.add()); break; case "sub": System.out.println(test.sub()); break; case "cheng": System.out.println(test.cheng()); break; case "chu": System.out.println(test.chu()); break; } } }我们会用switch语句来调用相应的方法,但是如果使用反射机制,就可以再运行时通过输入的运算符直接调用方法
下面是使用反射机制实现的
import java.util.Scanner; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Test { public static void main(String[] args) { try { //通过反射得到jisuan整个类 Class c = Class.forName("jisuan"); //使用Class类的newInstance()方法创建类的一个对象 Object test = c.newInstance(); //得到jisuan类中的所有非私有方法 Method[] method=c.getMethods(); for(Method me:method){ System.out.println(me.getName()+" "); } //得到jisuan类的所有非私有属性 Field[] fields =c.getFields(); for(Field f:fields){ System.out.println(f.getName()+" "); } Scanner sc=new Scanner(System.in); System.out.println("请输入第一个数"); int num1=Integer.parseInt(sc.nextLine()); //获取setNum1方法(Class.getDeclaredMethod()获取指定方法) Method setNum1=c.getDeclaredMethod("setNum1",int.class); //执行setNum1方法,第一个参数是操作对象,后面是传的值 setNum1.invoke(test,num1); System.out.println("请输入第二个数"); int num2=Integer.parseInt(sc.nextLine()); Method setNum2=c.getDeclaredMethod("setNum2",int.class); setNum2.invoke(test,num2); System.out.println("请输入运算符"); String operater=sc.nextLine(); //最后通过输入的运算符获取方法,不用switch Method setOperater=c.getDeclaredMethod(operater); System.out.println(setOperater.invoke(test)); }catch(Exception e){ e.printStackTrace(); } } }运行结果如下
通过这种小的实例能看出,反射会让我们的代码更灵活。
希望能给你带来帮助!!
相关文章推荐
- 浅谈:nofollow标签的使用与分析
- 胡博君浅谈Java中static的使用
- 使用gulp构建前端工程浅谈
- 浅谈Vue(使用vue+element ui搭建页面)
- 【捷哥浅谈PHP】第三弹---使用二分查找法查找数组中的元素位置
- GCD使用经验与技巧浅谈
- 浅谈VB6中的自定义类的使用
- 浅谈ASP.NET的include的使用方法
- 使用Java反射机制实现访问其他类的私有方法
- Android IPC机制(三):浅谈Binder的使用
- 浅谈C++KeyboardProc|LowLevelKeyboardProc函数使用
- 浅谈ListView、RecycleView、GridView的使用方法步骤和效果区别.TXT
- 浅谈jquery中使用canvas的问题
- 大雾课论文《浅谈简单使用计算机与算法快速解决物理问题》
- 从安卓获取短信内容为例 浅谈安卓的广播的使用
- 从中国电信和中国移动的套餐使用查询业务浅谈数据同步
- 浅谈Arrays.asList()方法的使用
- 浅谈mysql的使用权限以及用户安全
- 浅谈PHP拦截器之__set()与__get()的理解与使用方法
- 浅谈使用 Yii2 AssetBundle 中 $publishOptions 的正确姿势