Java反射机制与工厂模式
工厂模式属于创建型模式,它提供了一种创建对象的最佳方式。
它的特点是:客户端的程序类不直接牵扯到对象的实例化管理,只与接口发生关联,通过工厂类获取指定接口的实例化对象。
简单工厂模式如下:
interface Car {
public void Name();
}
class Audi implements Car {
public void Name() {
System.out.println("Audi");
}
}
class Factory{
private Factory() {}
public static Car getInstance(String className) {
if("Audi".equalsIgnoreCase(className)) {
return new Audi();
}
return null;
}
}
public class Test {
public static void main(String[] args) throws Exception {
Car audi = Factory.getInstance("Audi");
audi.Name();
}
}
简单工厂模式
问题在于,可能会有很多的继承接口的子类,那么工厂类就要一直更新下去,很麻烦。这时候,就引入反射机制。
package test;
interface Car {
public void Name();
}
class Audi implements Car {
public void Name() {
System.out.println("Audi");
}
}
class Factory {
private Factory() {}
public static Car getInstance(String className) {
Car instance = null;
try {
instance = (Car) Class.forName(className).getDeclaredConstructor().newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return instance;
}
}
public class Test {
public static void main(String[] args) throws Exception {
Car msg = Factory.getInstance("test.Audi");
msg.Name();
}
}
工厂模式
关于反射
反射最大的作用之一就在于可以不在编译时知道某个对象的类型,而在运行时通过提供完整的”包名+类名.class”得到。注意:不是在编译时,而是在运行时。
功能:
•在运行时能判断任意一个对象所属的类。
•在运行时能构造任意一个类的对象。
•在运行时判断任意一个类所具有的成员变量和方法。
•在运行时调用任意一个对象的方法。
说大白话就是,利用Java反射机制我们可以加载一个运行时才得知名称的class,获悉其构造方法,并生成其对象实体,能对其fields设值并唤起其methods。
应用场景:
反射技术常用在各类通用框架开发中。因为为了保证框架的通用性,需要根据配置文件加载不同的对象或类,并调用不同的方法,这个时候就会用到反射——运行时动态加载需要加载的对象。
特点:
由于反射会额外消耗一定的系统资源,因此如果不需要动态地创建一个对象,那么就不需要用反射。另外,反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题。
最后,如果接口也特别多的话,工厂类里还是要写很多个方法,这个问题可以用泛型解决,这样的工厂模式叫抽象工厂模式
package test;
interface Car {
public void Name();
}
class Audi implements Car {
public void Name() {
System.out.println("Audi");
}
}
interface Phone{
public void Name();
}
class iPhone implements Phone{
public void Name() {
System.out.println("iPhone");
}
}
class Factory {
private Factory() {} @SuppressWarnings("unchecked")
//instanceName 接口的子类 className接口的类型
public static <T> T getInstance(String instanceName, Class<T> className ) {
T instance = null;
try {
instance = (T) Class.forName(instanceName).getDeclaredConstructor().newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return instance;
}
}
public class Test {
public static void main(String[] args) throws Exception {
Car audi = Factory.getInstance("test.Audi", Car.class);
audi.Name();
iPhone iphonex = Factory.getInstance("test.iPhone", iPhone.class);
iphonex.Name();
}
}
抽象工厂模式
面试题:什么是java反射机制?
反射机制是 Java 语言提供的一种基础功能,赋予程序在时自省(introspect,官方用语)的能力。通过反射我们可以直接操作类或者对象,比如获取某个
对象的类定义,获取类声明的属性和方法,调用方法或者构造对象,甚至可以运行时修改类定义。
Java反射机制与工厂模式的更多相关文章
- Java反射机制在工厂模式中的应用
在本篇文章中就不详细介绍工厂模式,主要介绍一下反射在工厂模式中的使用,让读者对反射机制带来的好处有更深的认识. 首先看一下简单工厂模式 简单工厂模式(simple factory)是类的创建模式,又叫 ...
- Java反射机制demo(七)—反射机制与工厂模式
Java反射机制demo(七)—反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...
- 基于C#反射机制的工厂模式
简单介绍 反射提供了描写叙述程序集.模块和类型的对象(Type 类型). 能够使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或訪问其字段和属性. 假设代码中使用了特 ...
- Java反射机制在代理模式中的使用
代理模式的核心思路就是一个接口有两个子类,一个子类完成核心的业务操作,另一个子类完成与核心业务有关的辅助性操作. 代理模式分为静态代理模式和动态代理模式. 静态代理模式: //接口类 interfa ...
- Java反射机制及IoC原理
一. 反射机制概念 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义.在java中,只要给定类的名字, 那么就可以通 ...
- [转]Java反射机制详解
目录 1反射机制是什么 2反射机制能做什么 3反射机制的相关API ·通过一个对象获得完整的包名和类名 ·实例化Class类对象 ·获取一个对象的父类与实现的接口 ·获取某个类中的全部构造函数 - 详 ...
- Java反射机制Reflection
Java反射机制 1 .class文件 2 Class类 3 Class类与反射机制 4 Java反射机制的类库支持及简介 5 反射机制的定义与应用 6 反射机制Demo Java反射机制demo(一 ...
- Java反射机制的基本概念与使用
本篇文章分为以下几个部分: 1.认识反射 2.反射的源头(Class类) 3.利用反射操作构造方法 4.利用反射调用类中的方法 5.反射中的invoke方法 6.利用反射调用类中的属性 反射在我们普通 ...
- Java反射机制(带应用)
1.Java的反射机制: Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态 ...
随机推荐
- 快速上手Runtime(四)之动态添加方法
如果一个类方法非常多,加载类到内存的时候也比较耗费资源,可以使用动态给某个类,添加方法解决.做到优化内存,节省资源的效果. // // Person.m // ResolveInstanceMetho ...
- 返回JSON到前台的对象属性设置
1.项目中使用JSON的第三方架包:jackson-annotations-2.8.0.jar 2.可以将对象的属性返回进行相应的处理 比如格式化时间.密码敏感等属性 如:User.java pack ...
- office excel 2010 破解版下载地址
office excel 2010 破解版下载地址 http://www.xitongzhijia.net/soft/24189.html
- Openssl ciphers命令
一.简介 ciphers指令是用来展示用于SSL加密算法的工具 二.语法 openssl ciphers [-v] [-ssl2] [-ssl3] [-tls1] [cipherlist] 选项 -v ...
- 使用shell命令操作数据库
使用mysql的-e参数可以执行各种sql的(创建,删除,增,删,改.查)等各种操作 用法 mysql -uxxx –pxxx -e "mysql 命令" 当然还可以 ...
- cJSON结构体构建
cJSON结构体构建 一:cJSON的构建. int create_objects() { cJSON *root, *fmt, *img, *thm, *fld; char *out; int i; ...
- C# 基础连接已经关闭: 发送时发生错误
在程序中获取某个https网址的源码,GetRespose()时 出现了“基础连接已经关闭: 发送时发生错误.”的错误提示. 翻了论坛后,有个仁兄说: //.net 4 ...
- myeclipse工程中library 和 web-inf下lib的区别
eclipse工程下的library是用来编译里面的src中java文件的实际发布到tomcat时,仅仅只复制了WEB-INF/lib里面的jar包,所以出现eclipse可以正常编译但tomcat运 ...
- QT学习之多线程
[为什么要用多线程?] 传统的图形用户界面应用程序都只有一个执行线程,并且一次只执行一个操作.如果用户从用户界面中调用一个比较耗时的操作,当该操作正在执行时,用户界面通常会冻结而不再响应.这个问题可以 ...
- yii2项目实战-访问控制过滤器ACF讲解
作者:白狼 出处:http://www.manks.top/document/yii2-filter-control.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明 ...