黑马日记第十篇——反射

来源:互联网 发布:美国常用聊天软件 编辑:程序博客网 时间:2024/05/13 08:52

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

一、Class类
Class代表一份字节码对象,如:Class cls = 字节码;
得到字节码对象的三种方式:
1,类名.class。如:System.class。
2,对象.getClass()。如:new Data().getClass()。
3,Class.forName("类名")。如:Class.forName("java.util.Data")。
二、反射
反射就是吧Java类中的各种成分映射成相应的java类。(使用反射会导致性能下降)
1,ConsTructor类
该类用于等到某个类的构造方法。
得到某类的所有构造方法:
例:Constructor[] constructor= Class.forName("java.lang.String").getConstuctors();
得到某类的某一个构造方法:
例:Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);
调用构造方法:
newInstance(initargs);
2,Field类
表示某类或借口的字段的信息。通过Class类的getField方法或getDeclareField方法可以获取该对象。
例题:
将任意一个对象中的所有String类型成员变量所对应的字符串内容的“b”改为“a”。
public void changeStringValue(Object obj) throws Exception
{
  Field[] fileds = obj.getClass().getFields();
  for(Filed field : fields)
  {
    if(field.getType()==String.class)//注意:字节码之间比较相等使用“==”,规范。
    {
      String oldValue = (String)field.get(obj);
      String newValue = oldValue.replace('b','a');
      field.set(obj,newValue);
    }
  }
}
3,Method类
代表某个类中的成员方法。
通过Class类中的getMethod方法获取,格式如下:
getMethod(name,parameterType);
实例:
Method methodCharAt = String.class.getMethod("charAt",int.class);
methodCharAt.invoke(str,args);
上述实例中getMethod方法的两个参数为方法名和方法对应参数的字节码,其中invoke方法为调用方法。
注:jdk1.4与1.5中invoke方法区别:因为1.5出现了可变参数的概念,所以二者在invoke方法的描述上如下:
1.4:public Object invoke(Object obj,Object[] args)
1.5:public Object invoke(Object obj,Object...args)
所以如果使用1.4的格式改写实例中方法为:charAt.invoke("str",new Object[]{1});
---------------------- android培训 、java培训、期待与您交流!----------------------

原创粉丝点击