• 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无法对这些代码进行优化。所有反射的操作性能要低很多。
              还降低了可移植性,破坏了抽象性。

  • 相关阅读:
    应用程序无法启动,因为应用程序的并行配置不正确
    dotnetcore发布报版本错误
    C# 间隔时间休眠
    windows程序崩溃生成dump文件
    C# 委托的使用
    C# winform程序开机自启的方法
    win10Ping端口和查看端口占用
    415 DOM 查找列表框、下拉菜单控件、对表格元素/表单控件进行增删改操作、创建元素并且复制节点与删除、 对表格操作、通用性和标准的事件监听方法(点击后弹窗效果以及去掉效果)
    413 重温HTML + css 考试 + 访问HTML元素
    412 6个题 BOM and DOM 定义计数器 网页跳转 网页前进后退
  • 原文地址:https://www.cnblogs.com/zhaoyuwei/p/9269454.html
Copyright © 2020-2023  润新知