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  {@Overridepublic void eat() {System.out.println("我是香蕉");}
}public class Iphone implements Fruit {@Overridepublic 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  {@Overridepublic void eat() {System.out.println("我是香蕉");}
}/*** 苹果*/
public class Iphone implements Fruit {@Overridepublic 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无法对这些代码进行优化。所有反射的操作性能要低很多。
          还降低了可移植性,破坏了抽象性。

 

转载于:.html

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  {@Overridepublic void eat() {System.out.println("我是香蕉");}
}public class Iphone implements Fruit {@Overridepublic 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  {@Overridepublic void eat() {System.out.println("我是香蕉");}
}/*** 苹果*/
public class Iphone implements Fruit {@Overridepublic 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无法对这些代码进行优化。所有反射的操作性能要低很多。
          还降低了可移植性,破坏了抽象性。

 

转载于:.html