?Java反射的使用
?
????? Java反射这东西,起初理解起来比较麻烦,后面想通了,其实就是把编码的顺序颠倒了一下,起初我是先创建一个已知的类对象然后使用其属性方法,前提必须是我从编程一开始就指定了类,但是Java反射不同,起初我并不知道要创建一个什么样的类对象,是在程序运行过程中才知道,这个有什么好处呢?当然是灵活动态,怎么个灵活法,具体来几个例子体验下:
需求:
1、创建两个类:狗类、猫类继承父类动物接口,并实现其叫喊方法;
2、创建一个测试类,通过传入不同动物输出其叫声。比如狗就是汪汪,猫就是喵喵。
?
/** * @author Administrator * 动物接口 */ public interface Animal { //动物的叫喊方法 public void scream(); }
/** * @author Administrator * 狗类,实现动物接口 */ public class Dog implements Animal { @Override public void scream() { System.out.println("汪汪汪"); } }
/** * @author Administrator * 猫类,实现动物接口 */ public class Cat implements Animal { @Override public void scream() { System.out.println("喵喵喵"); } }
?测试类:
public class AnimalTest { Animal animal = null; //根据传递具体动物类型输出其叫声 public void makeNoise(String flag){ if( "狗".equals(flag) ){ animal = new Dog(); animal.scream(); }else if( "猫".equals(flag) ){ animal = new Cat(); animal.scream(); }else{ System.out.println("没有发现任何动物!"); } } public static void main(String[] args) { AnimalTest at = new AnimalTest(); at.makeNoise("猫"); //输出猫的叫声 } } 运行结果: 喵喵喵
????? 如果我还要加一种动物,比如羊的叫声,怎么办,首先得创建一个羊类实现animal接口,还得修改测试类的makeNoise方法,添加一种羊的判断:
//根据传递具体动物类型输出其叫声 public void makeNoise(String flag){ if( "狗".equals(flag) ){ animal = new Dog(); animal.scream(); }else if( "猫".equals(flag) ){ animal = new Cat(); animal.scream(); }else if( "羊".equals(flag) ){ animal = new Sheep(); animal.scream(); }else{ System.out.println("没有发现任何动物!"); } }
????? 如果还需要添加其它类型动物,同样在makeNoise方法中继续添加判断,这样我的程序越来越多,这个方法越来越大,有没有一个方法不用修改makeNoise方法就能实现:那就是Java放射的使用。
?针对上面方法的优化
? * 利用反射动态地在运行时创建指定对象
? * 这样即使当有新的类继承动物后 这个方法也不需要更改
/** * 针对上面方法的优化 * 利用反射动态地在运行时创建指定对象 * 这样即使当有新的类继承动物后 这个方法也不需要更改 * */ public void makeNoise(String animalName){ try { animal = (Animal)Class.forName(animalName).newInstance(); //根据传递的动物类(包名.类名)动态创建动物对象 animal.scream(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { AnimalTest at = new AnimalTest(); at.makeNoise("Sheep"); //输出羊的叫声 }
这样一来,就是再添加100个动物类型我也不用再修改上面的方法。
?
???其实使用反射时很简单,就那几个固定的方法,重要的是我们必须明白我们什么时候用它,用了它会给我们带来什么好处和它不好的地方!首先我们来看看它的使用方法:
?
?????? 反射的使用:
????????????????? 1.获得一个类的类模版
??? ?????????????????Class c = 对象名.getClass();
???????????????????? Class c = Class.forName(包名+类名);? ---常用
????????????????? ???我们也可以根据模版来获取其对应的类对象: c.newInstance();
?
??????????????????? 2.根据类模版获取类的信息:
??????????????????? ??获取类的属性:
???????????????????? ?Filed类----c.getFiled(String pname)? 获得指定属性(公共字段)
????????????????????? Filed类----c.getDeclearedFiled(String pname)? 获得指定属性(所有权限字段)
????????????????????? Filed[]----c.getFileds()? 获得所有属性(公共字段)
????????????????????? Filed[]----c.getDeclearedFileds()? 获得所有属性(所有权限字段)
?
?
????????????????????? 获取类的方法:
????????????????????? Method类----c.getMethod(String methodName,class[] params)? 获得指定方法(公共方法)
????????????????????? Method类----c.getDeclearedMethod(String methodName,class[] params)? 获得指定方法(所有方法)
????????????????????? Method[]----c.getMethods()? 获得所有方法(公共方法)
????????????????????? Method[]----c.getDeclearedMethods()? 获得所有方法(所有权限方法)?
?
?
?????????? 反射的好处,其实就一句话:高类聚低耦合。把代码动态化,提高了代码的灵活度减少了代码量!
?
????????反射的缺点,代码灵活度增大了,自然会带来效率的问题,因此,大量使用反射会带来效率低的问题!
?
?????? 其实在我们实际项目中,随着许多框架的使用,我们程序员很少在手动实现反射,但我们又无时无刻在使用反射,比如JDBC数据库连接第一句代码就在用反射,框架的使用,大量配置文件的出现,也是在使用反射去创建类对象,只是我们在使用时并没有手动去实现反射,这些工作都由框架来实现了!
?
?
原文:http://ranji13.iteye.com/blog/2295269