黑马程序员学习笔记八——java高新技术

来源:互联网 发布:电脑怎么使用手机网络 编辑:程序博客网 时间:2024/06/10 14:44

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

1.增强for循环

结构

fortype 变量名:变量集合){···}

*注意:迭代变量必须在迭()定义,集合变量可以使数组,或实现Iterable接口的集合类。

例:

Field[] fields= obj.getClass().getFields();//field数组。得到字节码对应的实例对象

for(Field field:fields){              //这里使用的就是增强for 循环

if(field.getType()==String.class){//对字节码比较用等号

String oldValue=(String)field.get(obj);

String newValue=oldValue.replace('b', 'a');//替换值

field.set(obj, newValue);//用新值替换旧值

}

}


2.反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。   

Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

Java的反射机制的实现要借助于4个类:classConstructorFieldMethod;其中class代表的时类对 象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象。通过这四个对象我们可以粗略的看到一个类的各个组 成部分。

1.如何得到各个字节码对应的实例对象。

类名。class;对象。Getclassclass forName(“类名”)。

例如:

String str="123";

Class cls1=str.getClass();

Class cls2=String.class;

Class cls3=Class.forName("java.lang.String");

其中classforname(“类名”)为我们主要用到的。

Classforname ()作用是返回字节码。返回方式有两种:1.字节码曾经加载过,jvm直接返回。2.jvm 还没加载过,把加载字节码缓存jvm中以后直接加载。

2.数组类型的实例对象

System.out.println(int[].class.isArray());//是否数组类型

3.Constructor类

//返回够着函数对象

Constructorconstructor1=String.class.getConstructor(StringBuffer.class);//StringBuffer表示选择那个构造方法

//实例化

String str2=(String)constructor1.newInstance(newStringBuffer("yui"));//指出对应的构造方法 此StringBuffer表示用个哪个

Class.newInstance()方法:

例子:String obj = (String)Class.forName("java.lang.String").newInstance();

该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。

该方法内部的具体代码是怎样写的呢?用到了缓存机制来保存默认构造方法的实例对象。

3.Field类:Field类代表某个类中的一个成员变量。

例子:替换对象String 对应某一字符

private static void changeStringValue(Object obj) throws Exception{

Field[] fields= obj.getClass().getFields();//field数组。得到字节码对应的实例对象

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);//用新值替换旧值

}

}

}


4.Method类代表某个类中的一个成员方法

得到类中的某一个方法:

例:Method charAt = Class.forName("java.lang.String").getMethod("charAt", int.class);

在调用方法上通常我们用:str.charAt(num);用反射 就是charAt.invoke(str, 1)

*注意:如果传递给Method对象的invoke()方法的第一个参数为null,说明该Method对象对应的是一个静态方法。

*张老师讲的jdk 1.41.5区别:

Jdk1.5public Object invoke(Object obj,Object... args) 可变参数,1.5的新特性

Jdk1.4public Object invoke(Object obj,Object[] args),即按jdk1.4的语法,需要将一个数组作为参数传递给invoke方法时,数组中的每个元素分别对应被调用方法中的一个参数,所以,调用charAt方法的代码也可以用Jdk1.4改写为 charAt.invoke(str, new Object[]{1})形式。

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

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


原创粉丝点击