首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

java 反照初探(1)

2013-01-23 
java 反射初探(1)Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一

java 反射初探(1)
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。这个是从网站上粘的,是比较官方的定义。但是很抽象很笼统,我自己的理解是:反射就是程序在编译时并不知道此类,也就是不会将此类加载到内存(有关java类加载的理解以后会增加),当程序运行到此处时,才加载此类,探知它的结构。从而可以实例化对象,调用方法。我理解的反射的好处有以下这么几个:(1)在设计通用类时可以使用,比如在JDBC时,javabean与数据库的字段之间如果是一一对应的,则可以用反射设计通用的方法,实现对数据库的操作。可以大大减少重复代码。(2)反射用在代理模式时可以大大减小耦合度。例如,在dao层,对数据的持久化可以采用jdbc,ibatis,hibernate等多种方法,业务层可以通过配置文件来获取使用哪个类,从而可以动态的加载该类,从而实例化该类对象。在以后变更持久层接口是只需要重写配置文件,不需要重新修改代码,然后卸载和安装。(3)很多设计框架都使用了反射技术,比如spring,struts2 等,对于android开发,反射技术显得更加重要。下面开始说说反射的基础api:根据自己的理解和网上的很多资料,总结出使用反射主要的是关注:构造器,成员变量和成员方法。构造器产生实例对象,成员变量为该对象赋予属性,方法为该对象赋予行为。(1)获取Class类对象:所有类其实都是Class的实例。

class Demo{    //codes...} class Test{    public static void main(String[] args) {        Class<?> demo1=null;        Class<?> demo2=null;        Class<?> demo3=null;        try{            //一般尽量采用这种形式            demo1=Class.forName("Reflect.Demo");        }catch(Exception e){            e.printStackTrace();        }        demo2=new Demo().getClass();//通过类的对象获取该类的Class实例        demo3=Demo.class;//通过类获取它的Class实例                 System.out.println("类名称   "+demo1.getName());        System.out.println("类名称   "+demo2.getName());        System.out.println("类名称   "+demo3.getName());             }}
? ? ? ? ? ? (2)通过无参构造器实例化类对象
Class<?>demo=Class.forName('包名.Demo'); Object obj=demo.newInstance();
?如果此Demo定义时取消了无参构造器,也就是说有有参构造器没有无参构造器,则会出现java.lang.InstantiationException异常;?? ? ?(3) 构造器? ? ? ? ? ?
package Reflect;import java.lang.reflect.Constructor;class Person{         public Person() {             }    public Person(String name){        this.name=name;    }    public Person(int age){        this.age=age;    }    public Person(String name, int age) {        this.age=age;        this.name=name;    }    public String getName() {        return name;    }    public int getAge() {        return age;    }    @Override    public String toString(){        return "["+this.name+"  "+this.age+"]";    }    private String name;    private int age;} public class Test{    public static void main(String[] args) {        Class<?> demo=null;        try{            demo=Class.forName("Reflect.Person");        }catch (Exception e) {            e.printStackTrace();        }        Person per1=null;        Person per2=null;        Person per3=null;        Person per4=null;        Person per5=null;        try{        Constructor<?> cons[]=demo.getConstructors();  //取得全部的构造函数        Constructor<?>con=demo.getConstructor(new Class[]{String.class});//取得某一个构造函数            per1=(Person)cons[0].newInstance();            per2=(Person)cons[1].newInstance("Rollen");            per3=(Person)cons[2].newInstance(20);            per4=(Person)cons[3].newInstance("Rollen",20);            per5=(Person)con.newInstance(new Object[]{"某个构造函数"});        }catch(Exception e){            e.printStackTrace();        }        System.out.println(per1);        System.out.println(per2);        System.out.println(per3);        System.out.println(per4);        System.out.println(per5);    }}其他的api将会在下一篇博客中详细介绍

热点排行