黑马程序员_反射(1)

                               ------- android培训 java培训 、期待与您交流! ----------

1.反射机制就是在java程序运行状态中,对其任何一个类,都能调用其中所有的属性和方法,对于任何一个对象,都能调用其任何一个方法和属性,动态获取其信息,动态调用其方法。获取源程序的字节码的方式有3种:1)类名.class 2)方法名.getClass()

3)Class.forName(“类名”)

9.Integer.TYPE 的基本类型为int,可以用这种方式找出。Integer和int[]都不算基本类型。数组类型实例化对象用的方法是Class.isArray()。总之源程序中出现的类型,都有各自的Class实例对象。

10.反射就是把Java类中的各种成分映射成相应的java类。

11.Consructor类代表某个类的构造方法。例如:

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

Constructor[] constructors =

Class.forName(“java.lang.String”).getConstructors();

得到某一个构造方法:

Constructor[] constructors =

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

12.成员变量的反射机制:获取成员变量反射的值用例如如下代码实现:

ReflectPoint pt1 = new ReflectPoint(3,5);

Field fieldY = pt1.getClass().getField(“y”);   //ReflectPoint中的y字段是public申明,所以用getField,如果是private申明,就要用getDeclareField方法了。但是后者要通过暴力反射机制,追加fieldY.setAccessible(true);使拥有数据 获取权限。

举例说明:

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
public class ReflectTest {
      public static void main(String[] args) throws Exception{
            String str1 = “abc”;
           //三种方式得到Class类,即获得字节码
            Class cls1 = str1.getClass();//调用对象的getClass()方法
            Class cls2 = String.class;
 //类名.class方式
           Class cls3 = Class.forName(“java.lang.String”);//Class类的forName()方法
           //验证得到的是否为同一份字节码,输出结果都为true
          System.out.println(cls1 == cls2);
          System.out.println(cls1 == cls3);
          //判断是否为基本类型的字节码对象
          System.out.println(cls1.isPrimitive());
          //基本数据类型的的字节码获取只有一种方式,类名.class方式
          System.out.println(int.class.isPrimitive());
          //数组也是一种特定的类型
          System.out.println(int[].class.isPrimitive());//结果为false
          System.out.println(int[].class.isArray());//结果为true

           //构造方法的反射
           //Constructor类代表某个类中的一个构造方法
          //得到参数类型为StringBuffer的String的构造方法
          Constructor<String> constructor1 = String.class.getConstructor(StringBuffer.class);
          //用反射的方式得到new String(new StringBuffer(“abc”))的效果
          String str2 = (String)constructor1.newInstance(new StringBuffer(“abc”));
          System.out.println(str2.charAt(2));

          ReflectPoint pt1 = new ReflectPoint(3,5);
          Field fieldY = pt1.getClass().getField(“y”);//获取字段,fieldY代表一个变量
         //fieldY不是对象身上的变量,而是类上的,要用它去取某个对象上对应的值要调用fieldY的get(obj)方法
          System.out.println(fieldY.get(pt1));//结果输出为5
         //因为ReflectPoint中的x是private修饰的,无法用fieldX.get(pt1)获取,这是需要用getDeclareField(“x”);
         Field fieldX = pt1.getClass().getDeclaredField(“x”);
          //但是由于是私有的,只允许自己访问,所以还要设置它的访问权限
          fieldX.setAccessible(true);//这种方式一般就称为“暴力反射”
         System.out.println(fieldX.get(pt1));

          changeStringValue(pt1);
          System.out.println(pt1.toString());

     }
     private static void changeStringValue(Object obj) throws Exception{
           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);//吧newValue设置到obj对象中
                       }
           }
     }

}

用到的RelfectPoint类

public class ReflectPoint {
              private int x;
              public int y;
              public String str1 = “ball”;
              public String str2 = “ballball”;
              public String str3 = “itcase”;
              public ReflectPoint(int x, int y) {
                          super();
                          this.x = x;
                          this.y = y;
              }

             //复写时@Override,你的方法名写错了的时候编译器会自动报错</span>
            @ Override
             public String toString(){
                   return str1+”:”+str2+”:”+str3;
            }
}

 

                             -------android培训java培训、期待与您交流! ----------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值