黑马程序员-------反射

来源:互联网 发布:云服务器能绑定域名吗 编辑:程序博客网 时间:2024/06/05 02:42

---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------

 

反射技术(不是1.5的新特性 是从1.2开始的)
反射就是将java类中的各种成分映射成相应的java类
反射的作用:应用反射技术开发框架
  (1)Class类型
            如何得到各个字节码对应的对象实例
            a。类名.class,例如,System.class
            b.对象.getClass(),例如 new  Date().getclass
            c.Class.forName("类名");
       如下例:
           String str1="abcx";
            Class cls1=str1.getClass();
            Class cls2=String.class;
            Class cls3=Class.forName("java.lang.String");
            System.out.println(cls1==cls2);
            System.out.println(cls1==cls3);
            
            System.out.println(cls1.isPrimitive());//判断是否是原始类型
          System.out.println(int.class.isPrimitive());
          System.out.println(int.class==Integer.class);
          System.out.println(int.class==Integer.TYPE);//判断Integer(包装类)的类型是否是基本类型
          System.out.println(int[].class.isPrimitive());
          System.out.println(int[].class.isArray());//判断数组是否为基本类型

  (2)  //构造方法的反射
          Constructor constructor1=String.class.getConstructor(StringBuffer.class);
          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不是对象身上的变量,而是类上的,要用它取对象上对应的值
          System.out.println(fieldY.get(pt1));
          Field fieldX =pt1.getClass().getDeclaredField("x");//x是私有的 所以他的字段是getDeclaredField
          fieldX.setAccessible(true);//强行反射 获得私有成员的值
          System.out.println(fieldX.get(pt1));

             //成员方法的反射
                 Method methodCharAt=String.class.getMethod("charAt", int.class);
          System.out.println(methodCharAt.invoke(str1/*null*/, 1));
          //如果这里是null 则说明该Method对应的方法是方法是静态方法  只有静态方法调用不需要对象




       ///实例将字符串中字符替换
            package cn.itcast.day1;

public class ReflectPoint {
   private int x;
   public int y;
   public  String st1="ball";
   public String st2="baseketball";
   public String st3="itcast";
public ReflectPoint(int x, int y) {
      super();
      this.x = x;
      this.y = y;
}
@Override
public String toString(){
      
      return st1+"::::"+st2+"::::"+st3;
}
   
      }
      
在另一个类中

      private static void changeValue(Object obj) throws Exception{
            // TODO Auto-generated method stub
            Field[] fields=obj.getClass().getFields();//通过对象的字节码得到对象的字段
            for(Field field:fields){//使用高级循环对字段进行循环
                  if(field.getType()==String.class)
                         //使用=号进行判断字段的类型是否和字符串的字节码相同  ,注意这里用=号要比equles好因为如果字节码只有相同的一份就不能用equals;
                  {
                        String oldValue=(String)field.get(obj);//若类型相同则通过get得到值
                        String newValue=oldValue.replace('b', 'a');
                        field.set(obj, newValue);
                        
                  }
                  
            }


//对接受数组参数的成员方法进行反射 (main方法)

mainMethod.invoke(null,new Object[]{new String[]{"****"}})   原因是将数组封装到Object【】中 防止编译器拆包
                  null,(Object){new String[]{}}  封装成Object对象  防止拆包

//  数组的反射应用(用于将数组中元素取出)
7、HashSet与ArrayList的比较以及HashCode的分析
        // TODO Auto-generated method stub
            Collection collections=new HashSet();//new ArrayList();
                    //这里hashset使集合中不可以有重复的元素 而ArrayList只是按顺序存储
            ReflectPoint pt1=new ReflectPoint(3,3);
            ReflectPoint pt2=new ReflectPoint(5,5);
            ReflectPoint pt3=new ReflectPoint(3,3);//如何判断pt1和pt3相同 使用hashset
            //HashCode()作用是计算hashset中元素存入的哈希吗 当从hashset中查找元素时先调用hashcode计算哈希码 根据哈希码找元素
            
            
            collections.add(pt1);
             collections.add(pt2);
             collections.add(pt3);
             collections.add(pt1);
            // pt1.y=7;
             /*当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的哪些参与计算哈希值的字段了,否则对象修改后的哈希值与最初存储进集合中的不同,这样检索不到对象了,也会删除不了对象 ,这样会造成内存泄露。
   Java中也会存在内存泄露,  所谓内存泄露就是永久不用的对象没有进行释放,也可以有在不正确的地方创建对象。
                  */
                  collections.remove(pt1);
                  
            
             System.out.println(collections.size());
            
      
      
      }
8、应用反射技术开发框架
className=java.util.HashSet  框架
InputStream ips=new FileInputStream("config.properties");
            Properties props=new Properties();//这里的Properties相当于HashMap  有键值对对应
            props.load(ips);//关联文件
            ips.close();
            
            String className=props.getProperty("className");//这里的Properties相当于HashMap  有键值对对应  及className键对应的值为classname(第一个)
            Collection collections=(Collection)Class.forName(className).newInstance();//调用对象的午餐构造方法


/配置文件的加载通常使用类加载器
            InputStream ips=ReflectTest2.class.getClassLoader().getResourceAsStream("cn/itcast/day1/config.properties");


---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------

详细请查看:<a href="http://edu.csdn.net/heima" target="blank">http://edu.csdn.net/heima</a>

原创粉丝点击