反射技术:
反射就是把java类中的各种成分映射成相应的java类。比如类中的属性,方法,包名,构造函数。都回独立成一个个相应的对象。主用应用于框架开发。
反射技术的基础Class类,获得字节码的方式有三种:1. Class cls = 类名.class;2. Class cls2 = Class.forName(“类名”);3. Class cls3 = new 类名().getClass();对于每一个类型都有他的Class实例对象,可以通过isPrimivitre(是否是原始类型)和isArray判断是什么类型。对于一个装箱类可以通过 类名.TYPE 获得它的基本数据类型.
构造方法反射的应用,获得所有构造函数:Constructor cons[] = Class.forName(“java.lang.String”).getConstructors();获得一个构造函数并实例一个对象(反射):Constructor constructor = Class.forName(“java.lang.String”).getConstructors(StringBuffer.class); String str = (String)constructor.newInstance(new StringBuffer(“abc”));使用默认构造函数实例一个对象可简写为:String str = String.class.newInstance()。
类成员变量反射的应用,对公有的成员变量:Field field = 对象名.getClass().getFiled(“字段名”);字段的值 = field.get(对象名);对私有的成员变量:Field field = 对象名.getClass().getDeclaredFiled(“字段名”);field.setAccessible(true);字段的值 = field.get(对象名);filed是一个类变量,不是对象变量。
类成员方法反射的应用,获得方法:Method 方法名 = 类名.calss.getMethod(“方法名”,参数类型);例:Method mothodchatAt = String.class.getMethod(”chatAt”,int.class);调用方法:方法名.invoke(调用方法的对象,参数);例:String str = mothodchatAt.invoke(new String(“abc”),1);如果调用方法的对象为null说明这个方法为静态方法。
package com.itcast.d23;
import java.lang.reflect.Method;
public class ReflectMethod {
public static void main(String[] args) throws Exception {
String startingClassName = "com.itcast.d23.TestReflect";
Method mainMethod = Class.forName(startingClassName).getMethod("test", String.class);
TestReflect tr = new TestReflect();
mainMethod.invoke(tr, "haha");
}
}
class TestReflect{
public void test(String str){
System.out.println(str);
}
}
数组与Object的关系及其反射类型,数组的字节码因维数和数组的类型改变。Arrays工具类的asList方法可以把数组转成List输出list打印所有元素。基本数据类型数组除外,因为asList的传入参数是Object数组,基本数据类型不属于Object。
数组反射的应用,使用isArray判是否是一个数组,java.lang.reflect.Array是数组的反射类,array.getLength(数组对象)获得数组的长度,array.get(数组对象,索引)获得指定索引的值。
ArrayList、HashSet的比较和HashCode的分析,ArrayList是有序的,HashSet是无序的,HashSet通过HashCode算出对象的哈希码,通过哈希码能够快速的查找到一个对象。储存到HashSet中的对象不能在HashSet中修改,否则可能会照成内存泄漏,因为对象修改了,HashCode算出来的哈希码可能与修改前的不相同了。
javaBean是一种特殊的java类,主要用于传递信息。
javaBean内省的操作:
PersonBean pb = new PersonBean("cc",22);
String propertyName = "name";
PropertyDescriptor pd = new PropertyDescriptor(propertyName, pb.getClass());
// 获得写方法
Method methodSetName = pd.getWriteMethod();
methodSetName.invoke(pb,value);
Method methodGetName = pd.getReadMethod();
Object retVal = methodGetName.invoke(pb);
使用BeanUtils工具包: (前提是导入了BeanUtils相关的包)
PersonBean pb = new PersonBean("cc",22);
// 可以是一个级联的变量
String propertyName = "name";
// 以字符串的方式处理参数
//retVal = BeanUtils.getProperty(pb, propertyName);
// 以原类型处理参数
retVal = PropertyUtils.getProperty(pb, propertyName);