李兴华java开发实战经典-反射

1.获取类反射名称
class Ref{
	
}

public class RefectoryDemo {

	public static void main(String[] args) {
		Ref myref=new Ref();
		System.out.println(myref.getClass().getName());

	}

}

结果:
fengray.Ref

2.通过反射创建一个泛型对象

反射机制用三种方法实例化一个对象
1、通过forName()方法(重点方式)
2、类.class(重点方式)
3、对象.getClass()

class Ref1{
	public Ref1() {
		System.out.println("constructe an object about Ref1");
	}
	
	public static void myprint() {
		System.out.println("do Ref1");
	}
	
}
class Ref2{
	public Ref2() {
		System.out.println("constructe an object about Ref2");
	}
	public  void myprint() {
		System.out.println("do Ref2");
	}
	
}

public class RefectoryDemo {

	public static void main(String[] args) {
		Class <?> class1=null;
		Class <?> class2=null;
		Class <?> class3=null;

		try {
			class1=Class.forName("fengray.Ref1");//通过forName方式实例化
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		class2=new Ref2().getClass();//通过object类中的方法实例化
		class3=Ref1.class;//通过类.class实例化
		System.out.println(class1.getName());
		System.out.println(class2.getName());
		System.out.println(class3.getName());

	}

}

结果:
constructe an object about Ref2
fengray.Ref1
fengray.Ref2
fengray.Ref1

3.class类中方法的使用

一下案例中Person类必须存在无参构造方法,案例中Person类有一个默认的无参构造方法。如果仅有有参构造方法则无法完成(有参重载不在其列)

class Person{
	private String name;
	private int age;
	public Person() {}//包含无参构造函数
	
	public Person(String name,int age) {
		this.name=name;
		this.age=age;
	}
	public String toString() {
		return "姓名:"+this.name+"====年龄"+this.age;
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}

public class RefectoryDemo {

	public static void main(String[] args) {
		Class<?> class1=null;
		try {
			class1=Class.forName("fengray.Person");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		Person person=null;
		
		try {
			person=(Person)class1.newInstance();//实例化对象

		} catch (InstantiationException | IllegalAccessException e) {
			e.printStackTrace();
		}
		
		person.setName("张三");
		person.setAge(30);
		System.out.println(person);
	}

}

结果:

姓名:张三====年龄30

明确调用有参构造函数

class Person{
	private String name;
	private int age;
	
	//public Person() {}//包含无参构造函数
	
	public Person(String name,int age) {
		this.name=name;
		this.age=age;
	}
	
	public String toString() {
		return "姓名:"+this.name+"====年龄"+this.age;
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}

public class RefectoryDemo {

	public static void main(String[] args) {
		Class<?> class1=null;
		try {
			class1=Class.forName("fengray.Person");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		Person person=null;
		//使用有参构造方法
		Constructor<?> cons[]=null;
		cons=class1.getConstructors();
		try {
			person=(Person)cons[0].newInstance("张三",20);//实例化对象

		} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
			e.printStackTrace();
		}
		
		System.out.println(person);
	}

}

结果:
姓名:张三====年龄20

4.取得类中的所有接口
interface Japan{
	
}

interface China{
	public static final String NATIONAL="China";
	public static final String AUTHOR="张三";
	public void sayChina();
	public String sayHello(String name,int age);
}

 class Person implements China,Japan{
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

	public Person() {}
	public Person(String name) {
		this.name=name;
	}
	public Person(String name,int age) {
		this(name);
		this.age=age;
	}
	@Override
	public void sayChina() {
		System.out.println("作者:"+AUTHOR+",国籍:"+NATIONAL);
	}
	@Override
	public String sayHello(String name, int age) {
		return name+" 您好! 我今年 "+age+"岁了";
	}
}

public class RefectoryDemo {
	public static void main(String[] args) {
		Class<?> class1=null;
		try {
			class1=Class.forName("fengray.Person");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		Class <?> myClass[]=class1.getInterfaces();//以数组形式返回实现的全部接口
		for (int i = 0; i < myClass.length; i++) {
			System.out.println(myClass[i].getName());
		}
	}

}

结果://输出了所有Person 类用到的接口
fengray.China
fengray.Japan

4.取得类所继承的父类
interface China{
	
	public static final String NATIONAL="China";
	public static final String AUTHOR="张三";
	public void sayChina();
	public String sayHello(String name,int age);
}

 class Person implements China{
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

	public Person() {}
	public Person(String name) {
		this.name=name;
	}
	public Person(String name,int age) {
		this(name);
		this.age=age;
	}
	@Override
	public void sayChina() {
		System.out.println("作者:"+AUTHOR+",国籍:"+NATIONAL);
	}
	@Override
	public String sayHello(String name, int age) {
		return name+" 您好! 我今年 "+age+"岁了";
	}
}

public class RefectoryDemo {
	public static void main(String[] args) {
		Class<?> class1=null;
		try {
			class1=Class.forName("fengray.Person");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		Class <?> class2=class1.getSuperclass();//取得父类,即Object类
		System.out.println(class2.getName());
	}

}

结果:
java.lang.Object

5.取得类中的全部构造方法
interface China{
	
	public static final String NATIONAL="China";
	public static final String AUTHOR="张三";
	public void sayChina();
	public String sayHello(String name,int age);
}

 class Person implements China{
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

	public Person() {}
	public Person(String name) {
		this.name=name;
	}
	public Person(String name,int age) {
		this(name);
		this.age=age;
	}
	@Override
	public void sayChina() {
		System.out.println("作者:"+AUTHOR+",国籍:"+NATIONAL);
	}
	@Override
	public String sayHello(String name, int age) {
		return name+" 您好! 我今年 "+age+"岁了";
	}
}

public class RefectoryDemo {
	public static void main(String[] args) {
		Class<?> class1=null;
		try {
			class1=Class.forName("fengray.Person");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		Constructor<?>[] class2=class1.getConstructors();//取得类中的全部构造方法
		for (int i = 0; i < class2.length; i++) {
			System.out.println("输出构造方法:"+class2[i]);
		}
	}

}

结果:
输出构造方法:public fengray.Person(java.lang.String)
输出构造方法:public fengray.Person(java.lang.String,int)
输出构造方法:public fengray.Person()

5.取得类中的构造方法的参数类型
interface China{
	
	public static final String NATIONAL="China";
	public static final String AUTHOR="张三";
	public void sayChina();
	public String sayHello(String name,int age);
}

 class Person implements China{
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

	public Person() {}
	public Person(String name) {
		this.name=name;
	}
	public Person(String name,int age) {
		this(name);
		this.age=age;
	}
	@Override
	public void sayChina() {
		System.out.println("作者:"+AUTHOR+",国籍:"+NATIONAL);
	}
	@Override
	public String sayHello(String name, int age) {
		return name+" 您好! 我今年 "+age+"岁了";
	}
}

public class RefectoryDemo {
	public static void main(String[] args) {
		Class<?> class1=null;
		try {
			class1=Class.forName("fengray.Person");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		Constructor<?>[] class2=class1.getConstructors();//取得类中的全部构造方法
		for (int i = 0; i < class2.length; i++) {
			System.out.println("输出构造方法:"+class2[i]+"修饰符为:"+Modifier.toString(class2[i].getModifiers()));

			Class<?> Param[]=class2[i].getParameterTypes();//得到构造方法中的全部参数
				for (int j = 0; j < Param.length; j++) {
					System.out.println("参数 "+j+" 类型为:"+Param[j]);
				}
			System.out.println("**********");
		}
	}

}

结果为:
输出构造方法:public fengray.Person(java.lang.String)修饰符为:public
参数 0 类型为:class java.lang.String


输出构造方法:public fengray.Person(java.lang.String,int)修饰符为:public
参数 0 类型为:class java.lang.String
参数 1 类型为:int


输出构造方法:public fengray.Person()修饰符为:public


5.取得类中的全部方法(本类方法而非全部(含父类))

interface China{

public static final String NATIONAL="China";
public static final String AUTHOR="张三";
public void sayChina();
public String sayHello(String name,int age);

}

class Person implements China{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}

public Person() {}
public Person(String name) {
	this.name=name;
}
public Person(String name,int age) {
	this(name);
	this.age=age;
}
@Override
public void sayChina() {
	System.out.println("作者:"+AUTHOR+",国籍:"+NATIONAL);
}
@Override
public String sayHello(String name, int age) {
	return name+" 您好! 我今年 "+age+"岁了";
}

}

public class RefectoryDemo {
public static void main(String[] args) {
Class<?> class1=null;
try {
class1=Class.forName(“fengray.Person”);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

	Method[] methods=class1.getDeclaredMethods();//获得本类中的方法,如果使用getMethod()则可以获得全部方法
	Class<?> type=null;
	for (int i = 0; i < methods.length; i++) {
		type=methods[i].getReturnType();
		Parameter[] params=methods[i].getParameters();
		int modifer=methods[i].getModifiers();
		System.out.println("第 "+i+" 个方法 "+methods[i].getName()+" 类型为:"+type+" 修饰符为:"+Modifier.toString(modifer));
		for (int j = 0; j < params.length; j++) {
			System.out.println("参数为:"+params[j]);
		}
		System.out.println("*******************");
	}
}

}
结果为:
第 0 个方法 getName 类型为:class java.lang.String 修饰符为:public


第 1 个方法 setName 类型为:void 修饰符为:public
参数为:java.lang.String arg0


第 2 个方法 getAge 类型为:int 修饰符为:public


第 3 个方法 setAge 类型为:void 修饰符为:public
参数为:int arg0


第 4 个方法 sayChina 类型为:void 修饰符为:public


第 5 个方法 sayHello 类型为:class java.lang.String 修饰符为:public
参数为:java.lang.String arg0
参数为:int arg1


6.取得类中的全部属性
interface China{
	
	public static final String NATIONAL="China";
	public static final String AUTHOR="张三";
	public void sayChina();
	public String sayHello(String name,int age);
}

 class Person implements China{
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

	public Person() {}
	public Person(String name) {
		this.name=name;
	}
	public Person(String name,int age) {
		this(name);
		this.age=age;
	}
	@Override
	public void sayChina() {
		System.out.println("作者:"+AUTHOR+",国籍:"+NATIONAL);
	}
	@Override
	public String sayHello(String name, int age) {
		return name+" 您好! 我今年 "+age+"岁了";
	}
}

public class RefectoryDemo {
	public static void main(String[] args) {
		Class<?> class1=null;
		try {
			class1=Class.forName("fengray.Person");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		java.lang.reflect.Field[] fields=class1.getFields();
		for (int i = 0; i < fields.length; i++) {
			Class<?> type=fields[i].getType();//得到属性类型
			int mo=fields[i].getModifiers();//得到修饰符的数字
			String priv=Modifier.toString(mo);//还原修饰符
			System.out.println("以下是公共属性===");
			System.out.println(priv+" ");
			System.out.println(type.getName()+" ");//得到属性类型
			System.out.println(fields[i].getName());//输出属性名称
			System.out.println("***************************");
		}
	}

}

结果:
以下是公共属性===
public static final
java.lang.String
NATIONAL


以下是公共属性===
public static final
java.lang.String
AUTHOR


7.通过反射调用类中的方法
interface China{
	
	public static final String NATIONAL="China";
	public static final String AUTHOR="张三";
	public void sayChina();
	public String sayHello(String name,int age);
}

 class Person implements China{
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

	public Person() {}
	public Person(String name) {
		this.name=name;
	}
	public Person(String name,int age) {
		this(name);
		this.age=age;
	}
	@Override
	public void sayChina() {
		System.out.println("作者:"+AUTHOR+",国籍:"+NATIONAL);
	}
	@Override
	public String sayHello(String name, int age) {
		return name+" 您好! 我今年 "+age+"岁了";
	}
}


public class InvokeDemo {

	public static void main(String[] args) {
		
		Class <?> class1=null;
		try {
			class1=Class.forName("fengray.Person");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		try {
			Method method=class1.getMethod("sayChina");//找到sayChina方法
			method.invoke(class1.newInstance());//调用方法
		} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | InstantiationException e) {
			e.printStackTrace();
		}
		
	}

}

结果:
作者:张三,国籍:China

8.通过反射调用类中的带参带返回值的方法
interface China{
	
	public static final String NATIONAL="China";
	public static final String AUTHOR="张三";
	public void sayChina();
	public String sayHello(String name,int age);
}

 class Person implements China{
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

	public Person() {}
	public Person(String name) {
		this.name=name;
	}
	public Person(String name,int age) {
		this(name);
		this.age=age;
	}
	@Override
	public void sayChina() {
		System.out.println("作者:"+AUTHOR+",国籍:"+NATIONAL);
	}
	@Override
	public String sayHello(String name, int age) {
		return name+" 您好! 我今年 "+age+"岁了";
	}
}


public class InvokeDemo {

	public static void main(String[] args) {
		
		Class <?> class1=null;
		try {
			class1=Class.forName("fengray.Person");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		try {
			Method method=class1.getMethod("sayHello",String.class,int.class);//找到sayChina方法,并设置参数
			String string=null;
			string=(String) method.invoke(class1.newInstance(),"lisi",42);//调用方法
			System.out.println(string);
		} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | InstantiationException e) {
			e.printStackTrace();
		}
		
	}

}

结果:
lisi 您好! 我今年 42岁了

9.通过反射调用类中的setter和getter方法
interface China{
	
	public static final String NATIONAL="China";
	public static final String AUTHOR="张三";
	public void sayChina();
	public String sayHello(String name,int age);
}

 class Person implements China{
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

	public Person() {}
	public Person(String name) {
		this.name=name;
	}
	public Person(String name,int age) {
		this(name);
		this.age=age;
	}
	@Override
	public void sayChina() {
		System.out.println("作者:"+AUTHOR+",国籍:"+NATIONAL);
	}
	@Override
	public String sayHello(String name, int age) {
		return name+" 您好! 我今年 "+age+"岁了";
	}
}


public class InvokeDemo {

	public static void main(String[] args) {
		
		Class <?> class1=null;
		Object object=null;
		
		try {
			class1=Class.forName("fengray.Person");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		try {
			object=class1.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		setter(object, "name", "ncepu", String.class);
		setter(object, "age", 32, int.class);
		getter(object, "name");
		getter(object, "age");

	}
	/*
	 * Object obj:要操作的对象
	 * String att:要操作的属性
	 * Object value:要设置的属性内容
	 * Class<?> type:要设置的属性类型
	 */
	
	public static void setter(Object obj,String att,Object value,Class<?> type) {
		try {
			Method method=obj.getClass().getMethod("set"+initStr(att),type);
			method.invoke(obj,value);
		} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
			e.printStackTrace();
		}
	}
	
	public static void getter(Object object,String att) {
		try {
			Method method=object.getClass().getMethod("get"+initStr(att));
			System.out.println(method.invoke(object));

		} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
			e.printStackTrace();
		}
	}
	
	public static String initStr(String old) {
		String str=old.substring(0,1).toUpperCase()+old.substring(1);
		return str;
		
	}

}

结果:
ncepu
32

10.通过反射调用类中的属性
interface China{
	
	public static final String NATIONAL="China";
	public static final String AUTHOR="张三";
	public void sayChina();
	public String sayHello(String name,int age);
}

 class Person implements China{
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

	public Person() {}
	public Person(String name) {
		this.name=name;
	}
	public Person(String name,int age) {
		this(name);
		this.age=age;
	}
	@Override
	public void sayChina() {
		System.out.println("作者:"+AUTHOR+",国籍:"+NATIONAL);
	}
	@Override
	public String sayHello(String name, int age) {
		return name+" 您好! 我今年 "+age+"岁了";
	}
}


public class InvokeDemo {

	public static void main(String[] args) {
		
		Class <?> class1=null;
		Object object=null;
		
		try {
			class1=Class.forName("fengray.Person");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		try {
			object=class1.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		Field nameField=null;
		Field ageField=null;
		try {
			nameField=class1.getDeclaredField("name");//取得本类属性
			ageField=class1.getDeclaredField("age");
			
			nameField.setAccessible(true);//设置属性可见(因为name和age为private访问限制)
			ageField.setAccessible(true);
			
			nameField.set(object,"zhangsan");
			ageField.set(object, 30);
			
			System.out.println("姓名:"+nameField.get(object));
			System.out.println("年龄:"+ageField.get(object));

		} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
			e.printStackTrace();
		}
	
	}

}

结果:
姓名:zhangsan
年龄:30

11.通过反射操作数组—取得数组信息并修改数组内容
public class InvokeDemo {

	public static void main(String[] args) {
		int temp[]= {1,2,3};
		Class<?> class1=temp.getClass().getComponentType();//取得数组class对象
		System.out.println("类型:"+class1.getName());
		System.out.println("数组长度:"+Array.getLength(temp));
		System.out.println("第一个元素内容:"+Array.get(temp,0));
		Array.set(temp,0,6);
		System.out.println("第一个元素内容:"+Array.get(temp,0));
	}
}

结果:
类型:int
数组长度:3
第一个元素内容:1
第一个元素内容:6

Array类可以修改数组的大小(长度)

public class InvokeDemo {

	public static void main(String[] args) throws Exception {
		int temp[]= {1,2,3};
		int newTemp[]=(int[]) arrayInc(temp,5);
		print(newTemp);
		System.out.println("\n********************");
		
		String t[]= {"ncepu","tingshua","pku","normalU"};
		String nt[]=(String [])arrayInc(t, 8);
		print(nt);
	}
	//Array类可以修改数组的大小(长度)
	public static Object arrayInc(Object obj,int len) {
		Class <?> class1=obj.getClass();
		Class<?> arr=class1.getComponentType();//得到数组对象
		Object newObj=Array.newInstance(arr, len);//开辟新的大小
		int copy=Array.getLength(obj);
		System.arraycopy(obj,0,newObj,0,copy);//拷贝内容
		
		return newObj;
	}
	
	public static void print (Object obj) {
		Class<?> class2=obj.getClass();
		if (!class2.isArray()) {
			return;
		}
		Class<?> arr=class2.getComponentType();
		System.out.println(arr.getName()+"数组的长度是:"+Array.getLength(obj));
		
		for (int i = 0; i < Array.getLength(obj); i++) {
			System.out.print(Array.get(obj,i)+"**");
			
		}
	}

}

结果:
int数组的长度是:5
12300**


java.lang.String数组的长度是:8
nceputingshuapkunormalUnullnullnullnull

12.静态代理操作

一个代理类为一个接口服务(实现)

interface Subject{
	public String say(String name,int age);
	
}

class RealSubject implements Subject{

	@Override
	public String say(String name, int age) {
		return "姓名:"+name+"  年龄:"+age;
	}
	
}

class ProxySubject implements Subject{
	private	Subject sub=null;
	public  ProxySubject(Subject sub) {
		this.sub=sub;
	}	

	@Override
	public String say(String name, int age) {
		return this.sub.say(name, age);
	}
	
}
public class InvokeDemo {

	public static void main(String[] args) throws Exception {
		Subject subject=new ProxySubject(new RealSubject());//通过代理实现了真实实现类
		String info=subject.say("zhangsan", 32);
		System.out.println(info);
	}
	

}

结果:
姓名:zhangsan 年龄:32

13.动态代理操作

使用invocatonHandler接口作为最终操作类,替换掉ProxySubject(代理类)
动态生成一个代理操作

interface Subject{
	public String say(String name,int age);
	
}

class RealSubject implements Subject{

	@Override
	public String say(String name, int age) {
		return "姓名:"+name+"  年龄:"+age;
	}
	
}

class MyIvocationHandler implements InvocationHandler{
	private Object obj;
	public Object bind(Object obj) {//绑定一个真实类
		this.obj=obj;
		//动态返回一个代理
		return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		before();
		Object temp=method.invoke(this.obj, args);
		return temp;
	}
	
	public void before() {
		System.out.println("代理操作之前******");
	}
	
}
public class InvokeDemo {

	public static void main(String[] args) throws Exception {
		Subject subject=(Subject)new MyIvocationHandler().bind(new RealSubject());//通过代理实现了真实实现类
		String info=subject.say("zhangsan", 32);
		System.out.println(info);
	}

}

结果:
代理操作之前******
姓名:zhangsan 年龄:32

14.工厂设计模式
interface Fruit{
	public void eatFruit();
}

class Apple implements Fruit{

	@Override
	public void eatFruit() {
		System.out.println("****吃苹果****");
		
	}
	
}
class Orange implements Fruit{

	@Override
	public void eatFruit() {
		System.out.println("*****吃桔子******");
		
	}
	
}

//工厂类
class Factory{
	public static Fruit getInstance(String className) {
		Fruit fruit=null;
		if ("apple".equals(className)) {
			fruit=new Apple();
		}
		if ("orange".equals(className)) {
			fruit=new Orange();
		}		
		return fruit;
		
	}
}

public class InvokeDemo {

	public static void main(String[] args) throws Exception {
		Fruit fruit=Factory.getInstance("orange");
		if (fruit!=null) {
			fruit.eatFruit();
		}
		
	}
}

结果:
吃桔子*

使用反射改进的工厂类

interface Fruit{
	public void eatFruit();
}

class Apple implements Fruit{

	@Override
	public void eatFruit() {
		System.out.println("****吃苹果****");
		
	}
	
}
class Orange implements Fruit{

	@Override
	public void eatFruit() {
		System.out.println("*****吃桔子******");
		
	}
	
}

class Pear implements Fruit{

	@Override
	public void eatFruit() {
		System.out.println("*****吃梨子******");
		
	}
	
}

//工厂类
class Factory{
	public static Fruit getInstance(String className) {
		Fruit fruit=null;
		try {
			fruit=(Fruit) Class.forName(className).newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
		if ("apple".equals(className)) {
			fruit=new Apple();
		}
		if ("orange".equals(className)) {
			fruit=new Orange();
		}		
		return fruit;
		
	}
}

public class InvokeDemo {

	public static void main(String[] args) throws Exception {
		Fruit fruit=Factory.getInstance("fengray.Pear");
		if (fruit!=null) {
			fruit.eatFruit();
		}
	
	}

}

结果:
吃梨子*

继续的改进,使用反射改进工厂类(解决包路径的问题)
结合使用配置文件(属性文件,如fruit.prooerties)来绝对生产哪个类如:
apple=fengray.Apple
orange=fengray.Orange
pear=fengray.Pear
通过读取属性文件的键值对就可以知道生产哪个类,避免输入过长的类路径

interface Fruit{
	public void eatFruit();
}

class Apple implements Fruit{

	@Override
	public void eatFruit() {
		System.out.println("****吃苹果****");
		
	}
	
}
class Orange implements Fruit{

	@Override
	public void eatFruit() {
		System.out.println("*****吃桔子******");
		
	}
	
}

class Pear implements Fruit{

	@Override
	public void eatFruit() {
		System.out.println("*****吃梨子******");
		
	}
	
}
class Init{
	public static Properties getPro() {
		Properties pro=new Properties();
		File file=new File("d:"+File.separator+"fruit.properties");//找到属性文件
		if (file.exists()) {
			try {
				pro.load(new FileInputStream(file));
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else {
			try {
				pro.setProperty("apple", "fengray.Apple");
				pro.setProperty("orange", "fengray.Orange");
				pro.setProperty("pear", "fengray.Pear");
				pro.store(new FileOutputStream(file), "FRUIT CLASS");
			} catch (Exception e) {
				e.printStackTrace();
			}
			
		}
		return pro;
	}
}
//工厂类
class Factory{
	public static Fruit getInstance(String className) {
		Fruit fruit=null;
		try {
			fruit=(Fruit) Class.forName(className).newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
		if ("apple".equals(className)) {
			fruit=new Apple();
		}
		if ("orange".equals(className)) {
			fruit=new Orange();
		}		
		return fruit;
		
	}
}

public class InvokeDemo {

	public static void main(String[] args) throws Exception {
		Properties properties=Init.getPro();
		Fruit fruit=Factory.getInstance(properties.getProperty("apple"));
		if (fruit!=null) {
			fruit.eatFruit();
		}
	
	}

}

配置文件:fruit.properties
apple=fengray.Apple
orange=fengray.Orange
pear=fengray.Pear

结果:
吃苹果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值