Java反射2

来源:互联网 发布:西方音乐史重点知乎 编辑:程序博客网 时间:2024/05/17 10:28

1.2.3.Constructor类:

Constructor类代表某个类的一个构造方法。

得到某个类所有的构造方法:

Constructor[]  constructor = Class.forName(“java.lang.String”).getConstructor();

得到某一个构造方法:

Constructor  constructor =

Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);

创建实例对象:String str2 = (String)constructor1.newInstance(new StringBuffer("abc"));

1.2.4.Field类:

Field代表某个类的一个成员变量。提供有关类或接口的属性的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)属性或实例属性,简单的理解可以把它看成一个封装反射类的属性的类。

public void setAccessible(boolean flag)

设置是否有权限访问反射类中的私有属性的,只有设置为true时才可以访问,默认为false

public void set(Object obj,Object value)

设置指定属性的值。

public Object get(Object obj)

得到属性的值

 

问题:得到的Field对象是对应到类上面的成员变量,还是对应到对象上的成员变量?类只有一个,而该类的实例对象有多个,如果是与对象关联,那关联的是哪个对象呢?

测试代码:

public class ReflectPoint {

    private int x;

    public int y;

    public ReflectPoint(int x, int y) {

       this.x = x;

       this.y = y;

    }

public int getX() {

       return x;

    }

    public void setX(int x) {

       this.x = x;

    }

    public int getY() {

       return y;

    }

    public void setY(int y) {

       this.y = y;

    }

}

测试代码:

       ReflectPoint pt1 = new ReflectPoint(3,5);

       Field fieldY = pt1.getClass().getField("y");

       //fieldY的值是多少?是5,错!fieldY不是对象身上的变量,

//而是类上,要用它去取某个对象上对应的值

       System.out.println(fieldY.get(pt1));

       Field fieldX = pt1.getClass().getField("x");//出错,由于x是私有的

       Field fieldX = pt1.getClass().getDeclaredField("x");

       fieldX.setAccessible(true);

       System.out.println(fieldX.get(pt1));  

结论:

Field对象是对应到类上面的成员变量,而不是对应到对象上的成员变量,Field对象的get方法可以对象的成员变量的值。

 

练习:将任意一个对象中的所有String类型的成员变量所对应的字符串内容中的“b”改成“a”。

代码如下:

新建一个类Bean.java

public class Bean {

    public String str1 = "ball";

    public String str2 = "basketball";

    public String str3 = "itgroup";

}

新建一个客户端测试代码:

        Bean obj = new Bean();

       Field[] fields = obj.getClass().getFields();

       for(Field field : fields){

           if(field.getType() == String.class){

              String oldValue = (String)field.get(obj);

              String newValue = oldValue.replace('b', 'a');

              field.set(obj, newValue);

           }

       }

 

原创粉丝点击