您的位置:首页 > 编程语言 > Java开发

(浅谈)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();
}

}
}
运行结果如下



通过这种小的实例能看出,反射会让我们的代码更灵活。
希望能给你带来帮助!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java j2ee aop 反射