当前位置: 移动技术网 > IT编程>开发语言>Java > 简单总结Java的反射机制的运用

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

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

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

20151123162628545.png (744×312)

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

首先,我们看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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网