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
结果:
吃苹果