zoukankan      html  css  js  c++  java
  • java中的反射机制是什么

    给大家介绍一下java中的反射机制,java中反射机制更体现出了java的灵活性、多态、和类之间的耦合性。

    1:反射是一种间接操作目标对象的机制,只要给定类的名字,就可以通过反设机制获取所有的类信息。

        

         反射机制,我们只需要拿到这个user的名称,就可以获取到user类 里边的 属性 方法 构造等内容

    2:反射机制的作用

        2.1:反编译:将 .class文件编译成.java文件   .class-->.java

        2.2:通过反射机制访问java对象的属性,方法,构造方法等。

    3:通过反射获取Class类的方式

        

            //第一种方式 通过Class.forName获取
            Class c1 = Class.forName("com.zhibo.zyw.bdqn.Work");
            //第二种方式通过类 .class获取
            Class c2 = Work.class;  
           //第三种方式通过getClass去获取
            Work work = new Work();
            Class c3 =  work.getClass();

    3.4 c1,c2,c3这几个类对象,都代表的是 Work的整个类  这个看也不明显,我给做个测试:

        

    这样可以看出,c1,c2,c3持有的对象都是一个类型的,都获取到了我们的work类

    4,在给大家演示一个关于反射机制的例子

        

    /***
     * 水果的接口
     */
    public interface Fruit {
            void eat();
    }
    
    public class Banana implements Fruit  {
        @Override
        public void eat() {
            System.out.println("我是香蕉");
        }
    }
    
    public class Iphone implements Fruit {
        @Override
        public void eat() {
            System.out.println("我是苹果");
        }
    }
    /**
     * 工厂
     */
    public class Fonity {
        public static Fruit getFruit(String forName) {
            Fruit fruit = null;
            if ("Iphone".equals(forName)) {
                fruit = new Iphone();
            } else if ("Banana".equals(forName)) {
                fruit = new Orange();
            }
            return fruit;
        }
    
    }
    public class TestMan {
    
        public static void main(String[] args) throws Exception {
    
            Fruit fruit = Fonity.getFruit("com.zhibo.zyw.bdqn.Banana");
            fruit.eat();
        }
    }

      以上代码是没有采用反射机制去写的,大家看看一看有什么问题,如我们现在创建一个Orange类实现了Fruit的话,我们要获取Orange,我们就需要手动去修改我们Factior工厂里边的代码,我们修改了代码,我们的代码就会重新被编译,而且这样写的话,我们需要创建多个类都实现这个接口,我们就要反复的去修改我们的工厂

    如果采用反射机制的话,就可以不用从新在编译java类

    /**
     * 香蕉
     */
    public class Banana implements Fruit  {
        @Override
        public void eat() {
            System.out.println("我是香蕉");
        }
    }
    
    /**
     * 苹果
     */
    public class Iphone implements Fruit {
        @Override
        public void eat() {
            System.out.println("我是苹果");
        }
    }
    
    
    
    /**
     * 工厂
     */
    public class Fonity {
        public static Fruit getFruit(String forName) {
            Fruit fruit = null;
    
            try {
                fruit=Class.forName(forName).newInstance();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            return  fruit;
        }
    
    }
    
    
        public static void main(String[] args) throws  Exception {
    
            Fruit fruit =Fonity.getFruit("com.zhibo.zyw.bdqn.Banana");
            if (fruit!=null){
               fruit.eat();
            }
         }
    }

    在java中使用反射机制的也很多,比如: jdbc的Class.forName、spring aop动态代理底层也是反射技术,hibernate,struts2也都是用反射技术实现的。

    反射缺点:
         反射包括了一些动态的类型,所有JVM无法对这些代码进行优化。所有反射的操作性能要低很多。
              还降低了可移植性,破坏了抽象性。

  • 相关阅读:
    TinyMCE 官方插件一览表(不完全)
    关于在线编辑器的选择:tinymce
    file_put_contents 错误:failed to open stream: Invalid argument 一种原因
    QQ拼音输入法 该到放弃的时候了
    Apache 配置屏蔽某些请求头
    apache EnableMMAP指令
    xwamp 目录结构设计
    Windows服务器如何选 搭建WAMP环境
    Windows安装apache2.4
    自己动手打造WEB服务器 Windows + Apache + PHP + MySQL
  • 原文地址:https://www.cnblogs.com/zhaoyuwei/p/9269454.html
Copyright © 2011-2022 走看看