关于java反射机制

    技术2024-08-08  56

      反射就是将java类中的各个成分映射成为java类来进行操作。它提供了一种动态的功能,使我们可以在运行时获取类的信息。JVM为每个类创建一个Class类的实例,它包含了一个java类的全部信息,例如类名、方法(Method)、属性(Field)、构造器(Constructor)等。通过Class,我们就可以对这些信息进行操作。

      在java中,反射的实现还依赖于java.lang.reflect包中的接口、类。Structs、Spring、Hibernate等框架,都是基于这些反射API来实现其动态功能的。

      下面通过一些例子来说明:

     

    获取Class类的3种方法

     

    Class.forName("com.test.Example");         使用完整包名

    Class<Example> clazz = Example.class;    静态属性

     

    Example ex = new Example();

    Class<Example> exclass = ex.getClass();     调用getClass方法

     

    测试类

    class Test{

    private String ha;

    private int num;

    public Test(){

    super();

    }

    public Test(String ha,int num){

    super();

    this.ha=ha;

    this.num=num;

    }

    public void me(){

    System.out.println("happy new year!");

    }

    }

     

    (1)Field

    Test test = new Test("hi",100);

    Field field = test.getClass().getDeclaredField("num");

    int num1 = (Integer)field.get(test);

     

    (2)Method

    Class<Test> exclass = Test.class; 

    try{

    Method m = exclass.getDeclaredMethod("me");

    if(m!=null){

    Test test = exclass.newInstance();

    m.invoke(test);            //test对象 调用此Method对象表示的底层方法,即方法me()

    }

    }catch(Exception e){

    e.printStackTrace();}

     

    (3)Constructor

    Class<Test> exclass = Test.class; 

    Test test = exclass.newInstance();

     

    Constructor<Test> con = exclass.getConstructor(String.class,int.class);

    test = con.newInstance("world",180);          //用构造器创建对象

    System.out.println(test);         //打印信息

     

    (4)访问私有成员

    Field field = exclass.getDeclaredField("ha");

    field.setAccessible(true);           //设置可访问属性为true,即在使用时取消java语言访问检查

    System.out.println(field.get(test));             //打印test对象上此Field表示的字段值,即ha的值

     

    最新回复(0)