首页 > 编程语言 > 详细

十八、Java从头开始- Java反射的使用

时间:2016-05-06 02:44:40      阅读:186      评论:0      收藏:0      [点我收藏+]

?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数据库连接第一句代码就在用反射,框架的使用,大量配置文件的出现,也是在使用反射去创建类对象,只是我们在使用时并没有手动去实现反射,这些工作都由框架来实现了!

?

?

十八、Java从头开始- Java反射的使用

原文:http://ranji13.iteye.com/blog/2295269

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!