美文网首页
理解java中的反射

理解java中的反射

作者: charjack | 来源:发表于2018-07-27 15:43 被阅读0次

往往当我们面对一项新的知识时,我们往往需要知道三个方面,它是什么,它能做什么,它比原有知识强在哪里,我们该怎么使用它。当你能够解决这些问题时,便意味着你已经对这项知识入门了。

一、是什么

  Java Reflaction in Action有这么一句话,可以解释。反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变。通俗的讲就是反射可以在运行时根据指定的类名获得类的信息。

二、为什么

  我们为什么要使用反射,它的作用是什么,它在实际的编程中有什么应用。

  首先我们先明确两个概念,静态编译和动态编译。

静态编译:在编译时确定类型,绑定对象,即通过。

动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多

态的应用,有以降低类之间的藕合性。

  我们可以明确的看出动态编译的好处,而反射就是运用了动态编译创建对象。

  那么我们再来看看实际中反射又有什么好处那?

  往往对比能更加直观的向我们展示两者的不同。

  先从某个代码案例上来解释(套用一篇博文的一个例子:http://blog.csdn.net/justdoit_potato/article/details/51011843)

  若是不用反射,它是这样的

interfacefruit{  

    publicabstractvoideat();  

}  

classApple implementsfruit{  

    publicvoideat(){  

        System.out.println("Apple");  

    }  

}  

classOrange implementsfruit{  

    publicvoideat(){  

        System.out.println("Orange");  

    }  

}  

// 构造工厂类  

// 也就是说以后如果我们在添加其他的实例的时候只需要修改工厂类就行了  

classFactory{  

    publicstaticfruit getInstance(String fruitName){  

        fruit f=null;  

        if("Apple".equals(fruitName)){  

            f=newApple();  

        }  

        if("Orange".equals(fruitName)){  

            f=newOrange();  

        }  

        returnf;  

    }  

}  

classhello{  

    publicstaticvoidmain(String[] a){  

        fruit f=Factory.getInstance("Orange");  

        f.eat();  

    }  

}  

  可以发现,每当我们要添加一种新的水果的时候,我们将不得不改变Factory中的源码,而往往改变原有正确代码是一种十分危险的行为。而且随着水果种类的增加,你会发现你的factory类会越来越臃肿,

不得不说这是一种十分--的做法。(初学者可能会问,我们为什么不直接在main方法中new水果那,我们可能会需要getInstance方法做一些别的事情。。。所以不直接new);

     而反射无疑是一种聪明的办法,看代码。

interface fruit{  

    publicabstractvoid eat();  

}  

   class Apple implements fruit{  

    publicvoid eat(){  

        System.out.println("Apple");  

    }  

}  

   class Orange implements fruit{  

    publicvoid eat(){  

        System.out.println("Orange");  

    }  

}  

   class Factory{  

    publicstatic fruit getInstance(String ClassName){  

        fruit f=null;  

        try{  

            f=(fruit)Class.forName(ClassName).newInstance();  

        }catch (Exception e) {  

            e.printStackTrace();  

        }  

        return f;  

    }  

}  class hello{  

    publicstaticvoid main(String[] a){  

        fruit f=Factory.getInstance("Reflect.Apple");  

        if(f!=null){  

            f.eat();  

        }  

    }  

}  

  在出现新品种水果的时候,你完全不用去修改原有代码。

  从上面的案例中,我们可以清楚的体会到反射的优越性。

  那么有的人又会问,这个例子能完全明白,但是如果放到实际的编程,应用中,我们又会在什么情况下用到反射那?

  举一个看到过的例子,在实际开发中,我们需要把一个包中的class new出来,但是这个包中的类总是需要变动,那么怎么办,难道总是修改main方法中xxx=new xxx()吗。这样无疑是麻烦的。而运用反射。我们可以相应的增加一个配置文件,在里面记录包中所有的类名,包中类增加时就加一个类名,删除时就删除一个类名。让main方法去读取这个配置文件中的类名,通过反射获得实例,完全不用我们去修改main方法中的代码。

  反射还有什么用那?他甚至可以修改其他类中的私有属性。android开发中,我们需要改变一个私有标志位的时候,android源码并没有提供set方法,我们又不能改变源码,怎么办,反射可以完美解决这个问题。

  说了这么多,那么我们的开发中,为什么不全部都用反射那?一个原因,开销,它的开销是什么昂贵的,随意尽量在最需要的地方使用反射。

三、怎么用

  说完是什么,为什么,我们必然需要掌握如何使用反射,先看反射中涉及了那些方法。

Class c=Class.forName("className");注明:className必须为全名,也就是得包含包名,比如,cn.netjava.pojo.UserInfo; 

Object obj=c.newInstance();//创建对象的实例 

OK,有了对象就什么都好办了,想要什么信息就有什么信息了。 

获得构造函数的方法 

Constructor getConstructor(Class[] params)//根据指定参数获得public构造器

    Constructor[] getConstructors()//获得public的所有构造器

    Constructor getDeclaredConstructor(Class[] params)//根据指定参数获得public和非public的构造器

Constructor[] getDeclaredConstructors()//获得public的所有构造器 

获得类方法的方法 

Method getMethod(String name, Class[] params),根据方法名,参数类型获得方法

    Method[] getMethods()//获得所有的public方法

    Method getDeclaredMethod(String name, Class[] params)//根据方法名和参数类型,获得public和非public的方法

Method[] getDeclaredMethods()//获得所以的public和非public方法 

获得类中属性的方法 

Field getField(String name)//根据变量名得到相应的public变量

    Field[] getFields()//获得类中所以public的方法

    Field getDeclaredField(String name)//根据方法名获得public和非public变量

    Field[] getDeclaredFields()//获得类中所有的public和非public方法

  看到这些方法,你就可以明白,反射是多么的强大了,当你正确使用这些方法的时候,基本上是掌握了反射的技巧。

结合控制反转在springboot中的应用,在配置文件中或者其他地方编写了类,直接通过bean注解的方式,就可以获取到对应的类,并生成对象,就是用到了java中的反射。即:通过配置的名称获取到对应的类。

相关文章

  • Java面试题之JavaSE高级

    一、Java中的反射 1.说说你对Java中反射的理解 java中的反射首先是能够获取到Java...

  • Java高级题

    此文非原创,来源网络上的面试题 Java中的反射 1.说说你对Java中反射的理解 java中的反射首先是能够获取...

  • 理解java中的反射

    往往当我们面对一项新的知识时,我们往往需要知道三个方面,它是什么,它能做什么,它比原有知识强在哪里,我们该怎么使用...

  • 理解Java中的反射

    反射的理解 1、JVM虚拟机加载 .class文件流程 2、假设Object o = new Object( );...

  • Java 反射机制

    [1]. java反射详解[2]. Java Reflection(反射机制)详解[3]. 深入理解Java类型...

  • 总结

    java基础 Java中多态的理解 反射 Java序列化与反序列化 Volatile和Synchronized e...

  • Java中反射学习系列教程之二

    在上一篇文章《Java中反射学习系列教程之一》中我们学了什么是反射;反射中的反字怎么理解;以及反射的特点。今天我们...

  • Java基础之反射

    Java基础之—反射(非常重要)Java中反射机制详解Java进阶之reflection(反射机制)——反射概念与...

  • Java反射理解

    Java反射理解 Java类型信息 RTTI(运行时类型识别)源于《Thinking in Java》一书,其作用...

  • Java互联网公司-经典面试题附答案

    基础:Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)?优点:反射具有解耦性,缺点:反射属...

网友评论

      本文标题:理解java中的反射

      本文链接:https://www.haomeiwen.com/subject/lbwpeftx.html