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

猜你喜欢

转载自www.cnblogs.com/zhaoyuwei/p/9269454.html