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