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反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态 ...
随机推荐
- mysql 去重
select *, count(distinct name) from table group by name http://blog.sina.com.cn/s/blog_7e7249c301012 ...
- 开发 WebAPP 的几个前端框架(不断更新中)
http://mobileangularui.com/ http://ionicframework.com/ http://www.idangero.us/framework7/ (中文文档:http ...
- node-mysql中防止SQL注入
备注: 本文针对mysqljs/mysql. 为了防止SQL注入,可以将SQL中传入参数进行编码,而不是直接进行字符串拼接.在node-mysql中,防止SQL注入的常用方法有以下四种: 方法一:使用 ...
- coding创建项目
在本地,使用git 需要创建一个pom.xml文件,就可以导入到工作空间了! 在需要项目工作空间里,依次使用git命令执行 mkdir test //创建文件夹,项目名称cd test //切换 ...
- 关于fastjson的一些知识
今天被问到了一些有关fastjson的知识,问了fastjson内部的实现机制,笔者只是用过fastjson这个包,还真没了解过它的机制等. 下去后搜索了一些有关fastjson的知识,希望能对自己和 ...
- C程序之包含头文件
在C程序中包含文件有以下两种方法: 方法一:#include<XXX.h> 这里的XXX一般是改动较小的标准库,用符号"<"和">"将要 ...
- Boost智能指针使用总结
内存管理是一个比较繁琐的问题,C++中有两个实现方案: 垃圾回收机制和智能指针.垃圾回收机制因为性能等原因不被C++的大佬们推崇, 而智能指针被认为是解决C++内存问题的最优方案. 1. 智能指针定义 ...
- LWIP内存管理
LWIP是一种TCP/IP协议栈,与嵌入式操作系统一样也提供了内存管理. 内存池里面有多个同样大小的内存,不同类型的内存池其里面的内存大小不一样.
- Linux Mint 17使用配置
=> 调亮度: 方法一: 每次开机或注销登录之后需要重新设置 > /sys/class/backlight/intel_backlight/brightness #根据自己需要调值,如20 ...
- C#开发重用方法
获取类型先关信息 GetType()及typeof()