黑马程序员_技术加强之反射

来源:互联网 发布:信达软件下载 编辑:程序博客网 时间:2024/05/20 19:17

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


 反射的基石Class类:
 java中各个java类属于一类事物,各个java类都有自己的方法、属性、所属的包、类名等。
 我们用Class类来描述这一类事物。

 Class类的对象就是一个类在内存中所对应的字节码,表示的是一个类
 九个预定义Class实例对象
 boolean,byte,char,short,long,int,float,double和void :void.class;


 反射就是把java类中的各种成分映射成相应的java类。//reflect

import java.lang.*;
class Person
{
 Person(){}
 public String name;
 public int age;

}


class  fanshe1
{
 public static void main(String[] args) throws Exception
 {
  
          Person p=new Person();
    p.getClass();//获取对象所在位置的字节码

    Class c=Class.forName("Person");
    //返回与带有给定字符串名的类或接口相关联的 Class 对象(Class的对象即是类)。
    

    //确定此对象所表示的类或者接口所实现的接口
    Class[] d=p.getClass().getInterfaces();
    Class[] e=c.getInterfaces();

   

    System.out.println(p.getClass());
    System.out.println(c);
    System.out.println(Person.class);

    String a=c.getName();
    //getName()以String的形式放回该Class对象所对应的实体(类、接口、数组类、基本类型和void)名称


          String s1=new String();
    Class c1=s1.getClass();//获取String类在内存中的字节码;类在内存中以字节码的形式存储
    Class c2=String.class;
    Class c3=Class.forName("java.lang.String");

    sop(c1==c2);
    sop(c1==c3);//true :一个类型在类中只有一个字节码

    sop(c1.isPrimitive());//是否是基本数据类型 false //String 是一个类
    sop(int.class.isPrimitive());//true
    sop(int.class==Integer.class);//false,Integer是int的包装类,各有各的字节码
    sop(int.class==Integer.TYPE);//true,包装类.Type用于获取包装类的基本类型字节码
   
    sop(int[].class.isPrimitive());//false:只要在源程序中出现的数据类型,都有各自各Class实例对象
    sop(int[].class.isArray());//true

          //构造方法:用反射实现:String s=new String(new StringBuffer("abc"));
    //Constructor con1=String.class.getConstructor(StringBuffer.class);
    //String str1=(String)con1.newInstance(new StringBuffer("abc"));//返回的类型是Object,需要强制类型转换(由高到低)
    //sop(str1.charAt(2));

    //成员变量(字段)Field
    fieldTest f=new fieldTest("3",5);
    Field field=f.getClass().getField("b");
    //Object obj=field.get(f);
    Field field2=f.getClass().getDeclaredField("a");//获取声明的字段(包含私有)
    field2.setAccessible(true);//声明允许访问私有
    sop(field.get(f));
    sop(field2.get(f));

    //Method str1.charAt(1);

    Method me=String.class().getMethod("charAt",int.class);//方法名:哪一个构造方法
    System.out.println(me.invoke(str1,1));//"abc" 输出b

       replaceTest(f);

 }
 public static void replaceTest(Object obj)
 {
  Field[] fie=obj.getClass().getFields();//获取所以字段
  for(int i=0;i<fie.length;i++)
  {
   if(fie[i].getType()==String.class)
   {
    String oldValue=(String)fie[i].get(obj);
    String newValue=oldValue.replace('b','a');
    fie[i].set(obj,newValue);
   }
  }
  
 }
 public static void sop(Object obj)
 {
  System.out.println(obj);
 }
}

class fieldTest
{
 private String a;
 public int b;

 public String str1="aabcde";
 public String Str2="bbaa";
 public fieldTest(String a,int b)
 {
  this.a=a;
  this.b=b;
 }

 public String toString()
 {
  return str1+":"+str2;
 }
}

原创粉丝点击