一、什么是反射

  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 反射机制详解(下)

最新文章

  1. Angular 单元格合并
  2. CSS实现兼容性的渐变背景(gradient)效果
  3. 框架操作DOM和原生js操作DOM比较
  4. Struts2中的 配置文件
  5. 基于spring mvc的注解DEMO完整例子
  6. How to debug PostgreSQL function with pgAdminIII
  7. U3D UGUI学习1 - 层级环境
  8. Android如何调用第三方SO库
  9. php-fpm.conf 文件详解
  10. php 字符编码转换函数 iconv mb_convert_encoding比较
  11. 第9课_1_cluster安装
  12. Oracle Spatial-元数据及SDO_GEOMETRY
  13. 一步一步重写 CodeIgniter 框架 (6) —— 实现在控制器Controller中加载View
  14. bug:翻页
  15. 前端小白的gulp入门
  16. Linux安装mysql(Redhat6.5+MySQL5.7)(转载+原创补漏)
  17. C#常用工具类——Excel操作类(ZT)
  18. SQL WHERE 子句
  19. SpringMVC教程2
  20. 【黑客免杀攻防】读书笔记2 - 免杀与特征码、其他免杀技术、PE进阶介绍

热门文章

  1. 七天从零基础学习android(1)--配置环境
  2. java下XML与JSON互相转换的Utils类
  3. 查看MySQL系统变量的命令
  4. 【stl学习笔记】vector
  5. FreeFileSync同步定时执行
  6. string 是值类型,还是引用类型(.net)[转]
  7. Hibernate4之session核心方法
  8. 4 Ionic导航和核心组件--旅游应用
  9. createElement与innerHtml性能比較
  10. ExtJs 中获取 radiobutton 的值