java中的反射应用

基于反射工厂的案例演示:

package entity;
/**
 * 抽象动物类
 * @author tonysong
 *
 */
public abstract class Animale {

	 private String name;
	 
	 public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	/**
	 * 带参构造
	 * @param name
	 */
	public Animale(String name) {
		super();
		this.name = name;
	}

	//抽象的叫
	public abstract void shout();
}

package entity;
/**
 * 猫类继承动物
 * @author tonysong
 *
 */
public class Cat extends Animale{

	/**
	 * 带参构造
	 * @param name
	 */
	public Cat(String name) {
		super(name);
	}

	@Override
	public void shout() {
		//重写父类的抽象方法
		System.out.printf("我叫%s,喵喵",this.getName());
	}

	
}

package entity;
/**
 * 狗类
 * @author tonysong
 *
 */
public class Dog extends Animale{

	
	public Dog(String name) {
		super(name);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void shout() {
		System.out.printf("我叫%s,汪汪",this.getName());
		
	}

}

package factory;

import java.lang.reflect.InvocationTargetException;

import entity.Animale;
import entity.Cat;
import entity.Dog;

/**
 * 动物工厂
 * @author tonysong
 *
 */
public class Factory {
	
	/**
	 * 反射工厂
	 * @param className
	 * @param name
	 * @return
	 */
	public static Animale createAnimale(String className,String name){
		Animale an=null;
		try {
			//通过字符串得到类型
			Class<?> c=Class.forName(className);
			//通过带参构造得到对象
			 Object obj= c.getDeclaredConstructor(String.class).newInstance(name);
			 //类型判断
			 if(obj instanceof Animale)
			 an=(Animale)obj;
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return an;
	}

	/**
	 * 简单工厂
	 * @param num
	 * @param name
	 * @return
	 */
	public static Animale createAnimale(int num,String name){
		Animale an=null;
		switch(num){
		case 1: an=new Dog(name); break;
		case 2: an=new Cat(name); break;
		}
		return an;
	}
}

package test;

import entity.Animale;
import entity.Cat;
import entity.Dog;
import factory.Factory;

/**
 * 测试类
 * @author tonysong
 *
 */
public class Test {

	public static void main(String[] args) {
		
		Animale an=Factory.createAnimale("entity.Cat", "小白");
		an.shout();
		
	}

}




猜你喜欢

转载自blog.csdn.net/tonysong111073/article/details/7533008