JAVA反射机制

来源:互联网 发布:证券时报股市大数据 编辑:程序博客网 时间:2024/06/06 07:37

JAVA反射机制

---雨竹清风

JAVA反射机制:是指程序在运行时能够获取的类中的信息。在JAVA中只要有类的名字就可以通过反射机制来获取所有的信息。

现在的许多框架就是使用了这种反射机制来实现的,例如:Hibernatestruts。反射机制的优点就是可以实现动态创建对象和编译。

JAVA的反射机制的实现是要借助于4个类Class, Field, Method, Constructor

Class:程序运行时,JAVA运行时系统会对所有的对象进行运行时类型的处理。这项信息记录了每个对象所属的类,虚拟机用运行时的类型信息来选择正确的方法来执行。在Object类中定义了getClass()方法。所以我们可以通过这个方法来得到其对象。

Field:类的属性对象,可以通过Field对象获得类的成员变量的有关信息。

Method:类的方法对象。可以通过Method对象来获得有关指定类中方法的相关信息。

Constructor:类的构造器对象。可以通过Constructor对象来获得有关指定类的相关信息。

常用的:

获得构造函数的方法
Constructor getConstructor(Class[] params)//
根据指定参数获得public构造器

Constructor[]getConstructors()//获得public的所有构造器

ConstructorgetDeclaredConstructor(Class[] params)//根据指定参数获得public和非public的构造器

Constructor[]getDeclaredConstructors()//获得public的所有构造器
获得类方法的方法
Method getMethod(String name, Class[] params),
根据方法名,参数类型获得方法

Method[] getMethods()//获得所有的public方法

MethodgetDeclaredMethod(String name, Class[] params)//根据方法名和参数类型,获得public和非public的方法

Method[]getDeclaredMethods()//获得所以的public和非public方法
获得类中属性的方法
Field getField(String name)//
根据变量名得到相应的public变量

Field[] getFields()//获得类中所以public的方法

Field getDeclaredField(Stringname)//根据方法名获得public和非public变量

Field[] getDeclaredFields()//获得类中所有的public和非public方法

 

反射机制例子:

这一天来一直研究的反射机制的例子:

以获得构造函数的相关信息为例

MoreConstructor

public class MoreConstructor {

   String s;

   int i1 = 0,i2 = 0,i3 = 0;

   private MoreConstructor()

   }

   protected MoreConstructor(String s, int i)throws NumberFormatException{

      this.i1 = i;

      this.s = s;

   }

   public MoreConstructor(String...var){

      if(0 < var.length){

        i1 = Integer.valueOf(var[0]);

      }

      if(1 < var.length){

        i2 = Integer.valueOf(var[1]);

      }

      if(2 < var.length){

        i3 = Integer.valueOf(var[2]);

      }

   }

   public void print(){

      System.out.println("s: "+s);

      System.out.println("i1: "+i1);

      System.out.println("i2: "+i2);

   }


main方法中代码:

MoreConstructor

public class MoreConstructor {

   String s;

   int i1 = 0,i2 = 0,i3 = 0;

   private MoreConstructor()

   }

   protected MoreConstructor(String s, int i)throws NumberFormatException{

      this.i1 = i;

      this.s = s;

   }

   public MoreConstructor(String...var){

      if(0 < var.length){

        i1 = Integer.valueOf(var[0]);

      }

      if(1 < var.length){

        i2 = Integer.valueOf(var[1]);

      }

      if(2 < var.length){

        i3 = Integer.valueOf(var[2]);

      }

   }

   public void print(){

      System.out.println("s: "+s);

      System.out.println("i1: "+i1);

      System.out.println("i2: "+i2);

   }

      Class<MoreConstructor> exampleC = MoreConstructor.class;

      Constructor[] declaredConstructors = exampleC.getDeclaredConstructors();

      for(int i = 0; i < declaredConstructors.length; ++i){

        Constructor constructor = declaredConstructors[i];

        System.out.println("查看是否有可变参数"+constructor.isVarArgs());

        System.out.println("构造函数的入口参数依次是:");

        Class [] parameter = constructor.getParameterTypes();//返回所有的参数类型

        for(int j = 0; j < parameter.length; ++j){

           System.out.println(parameter[j] + " ");

        }

        Class []exceptionArray = constructor.getExceptionTypes();//获得所有的异常

        System.out.println("抛出异常类型:");

        for(int j = 0; j < exceptionArray.length; ++j){

           System.out.println(exceptionArray[j]);

        }         

 MoreConstructor ex2 = null;

        while(ex2 == null){

           try {

              if(i == 0){  

                 ex2 = (MoreConstructor) constructor.newInstance("7",3 );//注意参数必须与当时获取的方法名字对应

              }

              else if(i == 1){

                 String []s = new String[]{"100","200","300"};

                 ex2 = (MoreConstructor) constructor.newInstance((Object)s);

              }

              else{

                 ex2 = (MoreConstructor) constructor.newInstance();

              }

           } catch (Exception e) {

              // TODO Auto-generated catch block

              System.out.println("在创建对象时出现异常"+e);

              constructor.setAccessible(true);//设置为public,构造方法的权限修改为public

              continue;

           }

           ex2.print();

           System.out.println();

        }

      }


 注意:

MoreConstructor moreCons = new MoreConstructor();//下面沒有用到這個對象,所以可以删去

Class<MoreConstructor>exampleC = MoreConstructor.class;

Constructor[]declaredConstructors = exampleC.getDeclaredConstructors();

这三句话可以改为2

MoreConstructor moreCons = new MoreConstructor();

Constructor[]declaredConstructors = moreCons.getClass().getDeclaredConstructors();

 

0 0
原创粉丝点击