java 反射 工厂_Java反射机制与工厂模式

工厂模式属于创建型模式,它提供了一种创建对象的最佳方式。

它的特点是:客户端的程序类不直接牵扯到对象的实例化管理,只与接口发生关联,通过工厂类获取指定接口的实例化对象。

简单工厂模式如下:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 interfaceCar {2 public voidName();3 }4 class Audi implementsCar {5 public voidName() {6 System.out.println("Audi");7 }8 }9 classFactory{10 privateFactory() {}11 public staticCar getInstance(String className) {12 if("Audi".equalsIgnoreCase(className)) {13 return newAudi();14 }15 return null;16 }17 }18 public classTest {19 public static void main(String[] args) throwsException {20 Car audi = Factory.getInstance("Audi");21 audi.Name();22 }23 }

简单工厂模式

问题在于,可能会有很多的继承接口的子类,那么工厂类就要一直更新下去,很麻烦。这时候,就引入反射机制。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 packagetest;2 interfaceCar {3 public voidName();4 }5 class Audi implementsCar {6 public voidName() {7 System.out.println("Audi");8 }9 }10 classFactory {11 privateFactory() {}12 public staticCar getInstance(String className) {13 Car instance = null;14 try{15 instance =(Car) Class.forName(className).getDeclaredConstructor().newInstance();16 } catch(Exception e) {17 e.printStackTrace();18 }19 returninstance;20 }21 }22 public classTest {23 public static void main(String[] args) throwsException {24 Car msg = Factory.getInstance("test.Audi");25 msg.Name();26 }27 }

工厂模式

关于反射

反射最大的作用之一就在于可以不在编译时知道某个对象的类型,而在运行时通过提供完整的”包名+类名.class”得到。注意:不是在编译时,而是在运行时。

功能:

•在运行时能判断任意一个对象所属的类。

•在运行时能构造任意一个类的对象。

•在运行时判断任意一个类所具有的成员变量和方法。

•在运行时调用任意一个对象的方法。

说大白话就是,利用Java反射机制我们可以加载一个运行时才得知名称的class,获悉其构造方法,并生成其对象实体,能对其fields设值并唤起其methods。

应用场景:

反射技术常用在各类通用框架开发中。因为为了保证框架的通用性,需要根据配置文件加载不同的对象或类,并调用不同的方法,这个时候就会用到反射——运行时动态加载需要加载的对象。

特点:

由于反射会额外消耗一定的系统资源,因此如果不需要动态地创建一个对象,那么就不需要用反射。另外,反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题。

最后,如果接口也特别多的话,工厂类里还是要写很多个方法,这个问题可以用泛型解决,这样的工厂模式叫抽象工厂模式

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 packagetest;2 interfaceCar {3 public voidName();4 }5 class Audi implementsCar {6 public voidName() {7 System.out.println("Audi");8 }9 }10 interfacePhone{11 public voidName();12 }13 class iPhone implementsPhone{14 public voidName() {15 System.out.println("iPhone");16 }17 }18 classFactory {19 privateFactory() {}20

21 @SuppressWarnings("unchecked")22 //instanceName 接口的子类 className接口的类型

23 public static T getInstance(String instanceName, ClassclassName ) {24 T instance = null;25 try{26 instance =(T) Class.forName(instanceName).getDeclaredConstructor().newInstance();27 } catch(Exception e) {28 e.printStackTrace();29 }30 returninstance;31 }32 }33 public classTest {34 public static void main(String[] args) throwsException {35 Car audi = Factory.getInstance("test.Audi", Car.class);36 audi.Name();37 iPhone iphonex = Factory.getInstance("test.iPhone", iPhone.class);38 iphonex.Name();39 }40 }

抽象工厂模式

面试题:什么是java反射机制?

反射机制是 Java 语言提供的一种基础功能,赋予程序在时自省(introspect,官方用语)的能力。通过反射我们可以直接操作类或者对象,比如获取某个

对象的类定义,获取类声明的属性和方法,调用方法或者构造对象,甚至可以运行时修改类定义。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值