Java泛型 反射工厂模式_反射,工厂模式

该类不能运行,执行Test方法,需要空构造函数

demo3: 调用指定构造方法

demo2: 调用默认构造方法

demo1: 获得.class 字节码对象,对应Class对象. 3种方法

工厂模式: 使用接口, 接收通过工厂类返回来的实例对象. 工厂类通过读取配置文件,来决定实例化哪个类

packagecom.xiaofan.test;importjava.lang.reflect.Constructor;importjava.lang.reflect.InvocationTargetException;importjava.util.ArrayList;importorg.junit.Test;public classClassTest {public ClassTest(inta) {

}//类构造实例,调用指定构造方法

@Testpublic void demo3() throwsClassNotFoundException, SecurityException,

NoSuchMethodException, IllegalArgumentException,

InstantiationException, IllegalAccessException,

InvocationTargetException {//已知类情况下,通过new 创建实例

ClassTest classTest = new ClassTest(10);//1. 获得字节码对象

Class c = Class.forName("com.xiaofan.test.ClassTest");//2. 获得指定构造方法

Constructor constructor = c.getConstructor(int.class);//3、调用构造方法 获得对象

Object o = constructor.newInstance(10);

}//类构造实例,默认构造方法

@Testpublic void demo2() throwsClassNotFoundException, InstantiationException,

IllegalAccessException {//已知类情况下,通过new 创建实例

ClassTest classTest = new ClassTest(10);//未知类和对象情况下

String classDescription = "com.xiaofan.test.ClassTest";

Class c3=Class.forName(classDescription);

Object classTest2= c3.newInstance(); //执行默认构造方法

}//获得一个.class 字节码文件 对应Class类对象

@Testpublic void demo1() throwsClassNotFoundException {//已知类情况下 获得字节码对象

Class c1 = ClassTest.class;//已知一个对象,但是不知道这个对象属于哪个类,获得字节码对象

Object o = newArrayList();

Class c2= o.getClass(); //等价于 ArrayList.class//未知类和对象情况下

String classDescription = "com.xiaofan.test.ClassTest";

Class c3=Class.forName(classDescription);

}

}

-----------------------------------------------------------------------------------------------

通过反射获取成员变量,执行类中方法

packagecom.xiaofan.test;importjava.lang.reflect.Field;importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;importorg.junit.Test;public classFieldMethodTest {private intnum;public voidm(String s) {

System.out.println("反射测试的方法!" +s);

}/*** 通过反射的方式执行类中的方法*/@Testpublic void demo2() throwsClassNotFoundException, InstantiationException,

IllegalAccessException, SecurityException, NoSuchMethodException,

IllegalArgumentException, InvocationTargetException {//以前方式

FieldMethodTest fieldMethodTest = newFieldMethodTest();

fieldMethodTest.m("001");//1. 获得Class对象

Class c = Class.forName("com.xiaofan.test.FieldMethodTest");//2、获得对象

Object o =c.newInstance();//3. 获得m对象反射中Method对象

Method m = c.getMethod("m", String.class);//4. 调用o对象m方法

m.invoke(o, "008");

}/*** 通过反射获取成员变量,修改私有变量是可见的*/@Testpublic void demo1() throwsClassNotFoundException, SecurityException,

NoSuchFieldException, InstantiationException,

IllegalAccessException {//以前方法操作变量

FieldMethodTest fieldMethodTest = newFieldMethodTest();

fieldMethodTest.num= 10;//1、获得字节码文件

Class c = Class.forName("com.xiaofan.test.FieldMethodTest");//2、获得num成员变量 对应反射对象 Field

Field[] fields = c.getFields(); //获得所有public属性

System.out.println(fields.length);

Field[] fields2= c.getDeclaredFields(); //获得所有成员变量

System.out.println(fields2.length);

Field field= c.getDeclaredField("num");//3. 为num 赋值

Object o = c.newInstance(); //调用默认构造方法//修改私有变量是 可见的

field.setAccessible(true);

field.set(o,20);

System.out.println(field.get(o));

}

}

-------------------------------------------------------------------------------------------------------

自动装配

packagecom.xiaofan.test;importjava.lang.reflect.Field;importjava.util.HashMap;importjava.util.Map;importjava.util.Set;importorg.junit.Test;public classAutowireTest {

@Testpublic void demo1() throwsException {

Map map = new HashMap();

map.put("name", "小丽");

map.put("hobby", "音乐");

map.put("age", "20");

Person person= newPerson();

autowire(person, map);

System.out.println(person.getName());

System.out.println(person.getHobby());

User user= newUser();

autowire(user, map);

System.out.println(user.getName());

System.out.println(user.getAge());

}public void autowire(Object o, Map map) throwsException {//获得map 所有key

Set keys =map.keySet();//获得Object中所有属性//获得Class对象

Class c =o.getClass();//获得所有属性

Field[] fields =c.getDeclaredFields();for(Field field : fields) {//获得属性名称

String fieldName =field.getName();//判断属性名称是否存在于map的key

if(map.containsKey(fieldName)) {//完成属性封装

String value =map.get(fieldName);//修改私有属性可见性

field.setAccessible(true);

field.set(o, value);

}

}

}

}classUser {privateString name;privateString age;publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}publicString getAge() {returnage;

}public voidsetAge(String age) {this.age =age;

}

}classPerson {privateString name;privateString hobby;publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}publicString getHobby() {returnhobby;

}public voidsetHobby(String hobby) {this.hobby =hobby;

}

}

------------------------------------------------------------------------------------------------

工厂模式,测试类:

packagecom.xiaofan.demo;importorg.junit.Test;importcom.xiaofan.demo.impl.Fenggong;importcom.xiaofan.demo.impl.Liuqian;importcom.xiaofan.demo.impl.Wangfei;importcom.xiaofan.demo.impl.Yangliping;public classEveningParty {/*** 使用工厂模式,从配置文件中实例化所需要的对象

*@throwsException*/@Testpublic void demo2() throwsException {//对于估计要做事情,定义接口 ---- 不变的//变化的是 实现类//1. 歌曲类

Singer singer = Factory.findSinger(); //工厂

singer.sing();//2. 舞蹈类

Dancer dancer =Factory.findDancer();

dancer.dance();//3、语言类

Speaker speaker =Factory.findSpeaker();

speaker.speak();//4、动作类

Actor actor =Factory.findActor();

actor.action();

}/*** 传统方式,紧密耦合*/@Testpublic voiddemo1() {//对于估计要做事情,定义接口 ---- 不变的//变化的是 实现类//1. 歌曲类

Singer singer = new Wangfei(); //紧密耦合

singer.sing();//2. 舞蹈类

Dancer dancer = newYangliping();

dancer.dance();//3、语言类

Speaker speaker = newFenggong();

speaker.speak();//4、动作类

Actor actor = newLiuqian();

actor.action();

}

}

工厂类:

packagecom.xiaofan.demo;importjava.util.ResourceBundle;importcom.xiaofan.demo.impl.Liuqian;importcom.xiaofan.demo.impl.Yangliping;importcom.xiaofan.demo.impl.Zhaobenshan;public classFactory {public static Singer findSinger() throwsException {//return new Wangfei();//上面是传统模式,下面使用工厂模式返回实例对象//className = com.xiaofan.demo.impl.Zhangxueyou//ResourceBundle: 资源包类,可以使用指定的语言环境.使用类加载器的方式加载配置文件

String className = ResourceBundle.getBundle("party").getString("singer");

Class c=Class.forName(className);return(Singer) c.newInstance();

}public staticDancer findDancer() {return newYangliping();

}public staticSpeaker findSpeaker() {return newZhaobenshan();

}public staticActor findActor() {return newLiuqian();

}

}

接口类(这里只paste了其中一个接口):

packagecom.xiaofan.demo;public interfaceSinger {public voidsing();

}

接口实现类(这里只paste了其中一个实现类):

packagecom.xiaofan.demo.impl;importcom.xiaofan.demo.Singer;public class Zhangxueyou implementsSinger {

@Overridepublic voidsing() {

System.out.println("张学友 演唱 一路有你!");

}

}

配置文件:

singer =com.xiaofan.demo.impl.Zhangxueyou

dancer=com.xiaofan.demo.impl.Yangliping

speaker=com.xiaofan.demo.impl.Fenggong

actor=com.xiaofan.demo.impl.Liuqian

--------------------------------------------------------------------------------------------

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值