黑马程序员Java培训和Android培训_java高新技术(一)

反射技术:

        反射就是把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);  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值