Java基础知识:反射

黑马程序员---------Java基础知识:反射

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

在反射中讲到一个重要的概念,Class,这个与class是不一样的。Class代表的是Java中各个类,class是代码中具体的类,Class代表的是类的总和。Class描述了类的名字,类的访问属性,类的所属的报名,字段名称的列表,方法的列表等。

       为啥要学反射呢?是因为后期会学到框架,框架内用一个个具体的小程序来填充,而要控制这些小程序就需要一种机制来控制,这就是反射。使用反射可以获取一个类当中的所有内容,也可以去调用一个类的main函数,这样在后期的时候就不需要知道某个功能是怎么跑出来的,只需要类进行相应的操作即可。反射的好处就是增强了抽象的扩展性,使用反射后,底层某些代码需要修改时,也只需要修改部分代码即可,不影响整体功能。

    反射过程的步骤是:

1.    获得Class对象,即得到指定名称的字节码对象。

2.    实例化对象,获取类的属性,方法,构造函数。

3.    访问属性,调用方法,调用构造函数创建对象。 

 下面是反射部分代码

public  static void getString(Object objthrows Exception

    {

       Field[] fields =obj.getClass().getFields();   //获取公有变量 

       for(Field f:fields)

       {         

           if(f.getType()==String.class)//获取变量的类型,同一个字节码,所以用==

           {

              String strvaule =(String) f.get(obj);

             

              String strvaule1 =strvaule.replace("p","a");

              f.set(objstrvaule1);

              System.out.println(strvaule);                          

              System.out.println(strvaule1);

           }

       }

      

    }

    public static void Demo()throws Exception

    {

       String str1 ="abc";

       Class cls1 =str1.getClass();//获取字节对象

       Class cls2 =String.class;//获取字节码

       Class cls3 = Class.forName("java.lang.String");//获取字节码

       System.out.println(cls1==cls2);//字节码是否一样 true

       System.out.println(cls1==cls3);//true

       System.out.println(cls2==cls3);//true

     System.out.println(cls1.isPrimitive());//是否是基本数据类型 false ,为什么不是基本数据类型?

       System.out.println("String.class.isPrimitive():"+String.class.isPrimitive());//

 

       System.out.println(int.class.isPrimitive());//true

       System.out.println(int.class==Integer.class);//是否是同一个类型false

       System.out.println(int.class==Integer.TYPE);//Integer.TYPE 包装的基本类型

       System.out.println(int[].class.isPrimitive());//false

       System.out.println(int[].class.isArray());//true

      

       //Constructor constructor1=String.class.getConstructor(StringBuffer.class);//得到构造方法

       //String str2 =(String)constructor1.newInstance(new StringBuffer("abc"));//这句编译不过

       //System.out.println(str2.charAt(2));//正常情况下输出abc中的第二个字符,输出结果为c

       Constructor<String> constructor1 =(Constructor<String>)Class.forName("java.lang.String").getConstructor(StringBuffer.class);

       // String str2 =(String)constructor1.newInstance(new StringBuffer("abc"));

        // String str2 = (String)constructor1.newInstance("abc");

         //Exception in thread "main"java.lang.IllegalArgumentException: argument type mismatch

        

      

       ReflectPoint pt1 =new ReflectPoint(3, 5);

       Field fieldY = pt1.getClass().getField("y");//可以取出可见的变量

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

      

       Field fieldX =pt1.getClass().getDeclaredField("x");//获取私有成员变量

       fieldX.setAccessible(true);//暴力反射,将设有设为可以去获取的成员

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

    }

}

 

class Test1{

 

    public static void main(String[] args) {

       ArrayList<String> al = new ArrayList<String>();// 建立ArrayList对象

 

       al.add("苹果");// 添加元素

       al.add("雪梨");

       al.add("葡萄");

       al.add("桃子");

       al.add("芒果");

 

       // 在迭代时循环中next调用一次,就要hasNext判断一次。

       Iterator<String> it = al.iterator();// 迭代器使用

 

       while (it.hasNext())// 在迭代器中,使用hasNext判断迭代器内是否还有内容,有则则行下一句,没有则跳出

       {

           System.out.println(it.next());//

       }

 

    }

 

}

 

个人小结:反射主要说的是如何去获取一类类的名字,方法,变量,构造函数,如何将类的私有暴力转为公有,怎么去修改类里面的变量等操作,学好了这个,对以后的开发会很有用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值