Java 反射机制详解(上)
一、什么是反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
二、为什么要用反射
我们为什么要涌反射,反射的作用是什么,在实际开发中有什么应用
我们先了解编译的两个概念:
静态编译:在编译时确定类型,绑定对象,即通过
动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多 态的应用,有以降低类之间的藕合性。
我们可以明确的看出动态编译的好处,而反射就是运用了动态编译创建对象。
那么我们再来看看实际中反射又有什么好处呢?
我们用工厂模式代码示例:
- public interface Shape{
- void draw();
- }
- class Rectangle implements Shape{
- @Override
- public void draw(){
- System.out.println("Inside Rectangle::draw() method.");
- }}
- class Square implements Shape{
- @Override
- public void draw(){
- System.out.println("Inside Square::draw() method.");
- }}
- class Circle implements Shape{
- @Override
- public void draw(){
- System.out.println("Inside Circle::draw() method.");
- }}
- //构造工厂
- class ShapeFactory{
- //使用 getShape 方法获取形状类型的对象
- public static Shape getShape(String shapeType){
- if(shapeType == null){
- return null;
- }if(shapeType.equalsIgnoreCase("CIRCLE")){
- return new Circle();
- }elseif(shapeType.equalsIgnoreCase("RECTANGLE")){
- return new Rectangle();
- }elseif(shapeType.equalsIgnoreCase("SQUARE")){
- return new Square();
- }
- return null;
- }}
- class FactoryPattern Demo{
- public static void main(String[]args){
Shape
s=
ShapeFactory.
getShape(
"
CIRCLE"
);
s.draw();
}
}
}
根据示例可以看出,每当我们添加一个产品的同时,需要增加一个产品类,还需要修改工厂源码ShapeFactory,而往往修改源码是非常危险的,
随着产品的增加 ShapeFactory 类会越来越臃肿;
而利用反射有效降低类的耦合性,降低维护成本,请看代码:
- public interface Shape{
- void draw();
- }
- class Rectangle implements Shape{
- @Override
- public void draw(){
- System.out.println("Inside Rectangle::draw() method.");
- }}
- class Square implements Shape{
- @Override
- public void draw(){
- System.out.println("Inside Square::draw() method.");
- }}
- class Circle implements Shape{
- @Override
- public void draw(){
- System.out.println("Inside Circle::draw() method.");
- }}
- //构造工厂
- class ShapeFactory{
- //使用 getShape 方法获取形状类型的对象
- public static Shape getShape(String shapeType){
- Shape s = null;
- try{
- s=(Shape)Class.forName(shapeType).newInstance();
- }catch (Exception e) {
- e.printStackTrace();
- }
- return s;
- }}
- class FactoryPattern Demo{
- public static void main(String[]args){
- Shape f=ShapeFactory.getShape("Reflect.Rectangle"); //这里的产品类路径,实际项目多在配置文件中配置
- if(f!=null){
- f.draw();
- }
- }}
上面示例的代码,当增加产品时,是不用去修改工厂类ShapeFactory;可以很清楚体验到反射的灵活性和优越性。
举一个看到过的例子,在实际开发中,我们需要把一个包中的class new出来,但是这个包中的类总是需要变动,那么怎么办 ,难道总是修改main方法中xxx=new xxx()吗。这样无疑是麻烦的。而运用反射。我们可以相应的增加一个配置文件,在里面记录包中所有的类名,包中类增加时就加一个类名,删除时就删除一个类名。让main方法去读取这个配置文件中的类名,通过反射获得实例,完全不用我们去修改main方法中的代码。
反射还有什么用那?他甚至可以修改其他类中的私有属性。android开发中,我们需要改变一个私有标志位的时候,android源码并没有提供set方法,我们又不能改变源码,怎么办,反射可以完美解决这个问题。
说了这么多,那么我们的开发中,为什么不全部都用反射呢?一个原因,开销,它的开销是昂贵的,尽量在最需要的地方使用反射。
Java 反射机制详解(上)的更多相关文章
- Java 反射机制详解(下)
续:Java 反射机制详解(上) 三.怎么使用反射 想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息(方法,属 ...
- Java反射机制详解
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反 ...
- Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring
IOC(Inverse of Control) 可翻译为“控制反转”,但大多数人都习惯将它称为“依赖注入”.在Spring中,通过IOC可以将实现类.参数信息等配置在其对应的配置文件中,那么当 需要更 ...
- Java反射机制详解(1) -反射定义
首先,我们在开始前提出一个问题: 1.在运行时,对于一个java类,能否知道属性和方法:能否去调用它的任意方法? 答案是肯定的. 本节所有目录如下: 什么是JAVA的反射机制 JDK中提供的Refle ...
- java反射机制详解 及 Method.invoke解释
JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为ja ...
- [转]Java反射机制详解
目录 1反射机制是什么 2反射机制能做什么 3反射机制的相关API ·通过一个对象获得完整的包名和类名 ·实例化Class类对象 ·获取一个对象的父类与实现的接口 ·获取某个类中的全部构造函数 - 详 ...
- 【转载】Java反射机制详解
转自:http://baike.xsoftlab.net/view/209.html#3_8 1反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对 ...
- Java 反射机制详解
动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化.比如众所周知的ECMAScript(JavaScript)便是一个动态语言.除此之外如Ru ...
- java异常处理机制详解
java异常处理机制详解 程序很难做到完美,不免有各种各样的异常.比如程序本身有bug,比如程序打印时打印机没有纸了,比如内存不足.为了解决这些异常,我们需要知道异常发生的原因.对于一些常见的异常,我 ...
随机推荐
- Spring中使用byType实现Beans自动装配
以下内容引用自http://wiki.jikexueyuan.com/project/spring/beans-auto-wiring/spring-autowiring-byType.html: 此 ...
- 基于51单片机的CAN通讯协议C语言程序
//-----------------------函数声明,变量定义-------------------------------------------------------- #includ ...
- centos Crontab
minute hour day month week command 顺序:分 时 日 月 周 命令 第1列分钟1-59第2列小时1-23(0表示子夜)第3列日1-31第4 ...
- [RxJS] Implement RxJS `concatMap` by Waiting for Inner Subscriptions to Complete
Unlike mergeMap and switchMap, concatMap focuses on when "inner" subscriptions "compl ...
- B-Tree 索引和 Hash 索引的对照
对于 B-tree 和 hash 数据结构的理解可以有助于预測不同存储引擎下使用不同索引的查询性能的差异.尤其是那些同意你选择 B-tree 或者 hash 索引的内存存储引擎. B-Tree 索引的 ...
- 【转载】HTTP协议与WEB本质
当你在浏览器地址栏敲入"http://www.csdn.net/",然后猛按回车,呈现在你面前的,将是csdn的首页了(这真是废话,你会认为这是理所当然的).作为一个开发者,尤其是 ...
- AngularJS自己定义标签加入回调函数eval()
function helloworld(name){ console.log("hello!!!!!"+name) } var name="zhangsan"; ...
- iOS学习之动画效果的实现
// // ViewController.m // UI-动画练习 // // Created by jzq_mac on 15/7/22. // Copyright (c) 2015年 jz ...
- apache使用总结
由于某些原因,经常会使用apache(有时用nginx) 现在我主要用它做反向代理,偶尔弄一下负载均衡和添加head头 apache官网 http://httpd.apache.org/ 下载地址 h ...
- YTU 2980: 几点了
2980: 几点了 时间限制: 1 Sec 内存限制: 128 MB 提交: 37 解决: 9 题目描述 现有一个Time类可以用来记录时间,请输出Time记录的时间加上s秒后的时间. 只需提交补 ...