欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

简单总结Java的反射机制的运用

程序员文章站 2024-03-07 09:49:44
java 的反射机制是使其具有动态特性的非常关键的一种机制,也是在javabean 中广泛应用的一种特性。 简单来说,一个类或者一个对象是拥有下面几种属性的: meth...

java 的反射机制是使其具有动态特性的非常关键的一种机制,也是在javabean 中广泛应用的一种特性。

简单来说,一个类或者一个对象是拥有下面几种属性的:
method,constructor,field,其大致结构类图如下:

简单总结Java的反射机制的运用

我们现在用代码来说明问题:

首先,我们看class类,在class类中,我们可以看见下面的几个重要的方法;

  • getinterfaces()
  • getsuperclass();
  • isinterface();

这是用来得到一个类的接口或者超类,以及判断这个类是不是一个接口;

  • forname(string classname);根据一个类名得到一个相应的类类型;
  • getclassloader();得到这个类相应的类加载器;

以及下面的几种方法:

getfield(method/constructor)(s)(name); getdeclaredfield(method/constructor)(s)();


分别是获取这个类的相应的constructor,field,method的;

区别在于,含有declared的方法能够得到这个类所声明的所有的属性,而没有declared的只能得到公共public的属性;


而继承了member分别赋予了这个三个类能够得到声明其的class,用getdeclaringclass();在这里我们再次介绍一下modifiers,我们都知道在field或者constructor,method前面都含有若干修饰符,如:

public static final string name="corey";

等等,我们应用getmodifiers()能够拿到这个修饰符的一个整形值,然后应用modifier这个类的静态方法来进行判断;如:
   modifier.isstatic(int)等等;

接下来,我们来看看accessibleobject的几个主要的方法,accessibleobject中主要的几个方式第一是
getannotation();得到某个属性的注释;
isaccessible();能否访问;如果不能访问,我们可以采取setaccessible(boolean)来设置其的可访问性;(这个我们在spring中看到过);

然后我们分别来看看这个三个类一些重要的特性:


constructor:

  • newinstance(args):能够使用这个构造器得到一个类的实例;


field:

  • gettype();得到这个字段的类;
  • set/get(object,value):一系列的基本类型字段的设置方法或者object的设置方法;

method:

  • getparametertypes();得到所有参数的类型;
  • getexceptiontypes();得到所有抛出异常的类型;
  • invoke(object,args);调用object对象的这个方法,参数是args;

下面是一份实例代码:

package org.corey.demo;
public interface iname {
  public string getfirstname();
  public void setfirstname(string firstname);
  public string getlastname();
  public void setlastname(string lastname);
}

package org.corey.demo;
public class name {
  private string firstname;
  private string lastname;
  public string publicname;
  
  public name(string firstname, string lastname) {
    this.firstname = firstname;
    this.lastname = lastname;
  }
  public name() {
  }
  public string getfirstname() {
    return firstname;
  }
  public void setfirstname(string firstname) {
    this.firstname = firstname;
  }
  public string getlastname() {
    return lastname;
  }
  public void setlastname(string lastname) {
    this.lastname = lastname;
  }
}


package org.corey.demo;
import java.lang.reflect.constructor;
import java.lang.reflect.field;
import java.lang.reflect.method;
public class demo {
  /**
   * @param args
   */
  public static void main(string[] args) {
    try {
      class clazz = class.forname("org.corey.demo.name");
      constructor con = clazz.getdeclaredconstructor(new class[] {
          string.class, string.class });
      name corey = (name)(con.newinstance("corey", "zhou"));
      system.out.println(corey.getfirstname()+" "+corey.getlastname());
      field[] fields=clazz.getdeclaredfields();
      for(int index=0;index<fields.length;index++){
        system.out.println(fields[index].getname()+" accessible "+fields[index].isaccessible());
        
      }
      method[] methods=clazz.getdeclaredmethods();
      for(int index=0;index<methods.length;index++){
        system.out.println(methods[index].getname());
      }
      
      field field=clazz.getdeclaredfield("firstname");
      if(!field.isaccessible()){
        field.setaccessible(true);
        field.set(corey, "syna");
      }
      
      method method=clazz.getdeclaredmethod("setlastname", new class[]{string.class});
      
      method.invoke(corey, "wang");
      
      system.out.println(corey.getfirstname()+" "+corey.getlastname());
    } catch (exception e) {
      // todo auto-generated catch block
      e.printstacktrace();
    }
  }
}

console:

corey zhou
firstname accessible false
lastname accessible false
publicname accessible false
getfirstname
getlastname
setlastname
setfirstname
syna wang