黑马程序员——反射

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------
11.1. 反射的概念

反射就是在运行状态把Java 类中的各种成分映射成相应的Java 类,可以动态得获取所有的属性以及动态调用任意一个方法。

反射的基石----Class类,类名,代表一类事物。

返回的对象用类表示,返回的方法用类表示,返回的成员变量用类表示。反射,就是把java中的各个成分映射成相应的java类表示

11.2. 反射——构造方法

              Class clazz = 类名.class;

              Constuctor con = clazz.getConstructor(newClass[]{paramClazz1,paramClazz2,.....});

              con.newInstance(params....);

11.3. 反射——成员方法

             Method m=clazz.getMethod(methodName,newClass[]{paramClazz1,paramClazz2,.....});

            m.invoke();

11.4. 反射——属性

              Field field = clazz.getField(fieldName);

              field.setAccessible(true);//设置为可访问

              filed.setObject(value);         //设置值

              Object value = field.get(clazz);      //获得值

              Object staticValue = filed.get(Class);     //获得静态值

 

11.5  例子:‘b’改成‘a’

<span style="white-space:pre">	</span>changeStringValue(pt1);
	field.getType().equals(String.class);
	//用等号比,因为比的是字节码
	if(field.getType()==String.class){
	<span style="white-space:pre">	</span>String newValueokdValue.replace('b','a');
	<span style="white-space:pre">	</span>field.set(obj,newValue);
,   	 }

11.7. 应用

用于reflection的类,如Method,可以在java.lang.relfect包中找到。使用这些类的时候必须要遵循三个步骤:

第一步是获得你想操作的类的java.lang.Class对象。在运行中的Java程序中,用java.lang.Class类来描述类和接口等

第二步是调用诸如getDeclaredMethods的方法,以取得该类中定义的所有方法的列表。

第三步——使用reflectionAPI来操作这些信息

例子:

package reflect;
 
importjava.util.ArrayList;
importjava.util.Collection;
importjava.util.HashSet;
 
public classReflectDemo {
public static voidmain(String[] args)
{
Collectioncollections=new HashSet();
ReflectPointpt1=new ReflectPoint(3,3);
ReflectPointpt2=new ReflectPoint(5,5);
ReflectPointpt3=new ReflectPoint(3,3);
collections.add(pt1);
collections.add(pt2);
collections.add(pt3);
collections.add(pt1);
System.out.println(collections.size());
}
}

11.8. 知识点归纳

1.九个预定义类

八个基本的数据类型分别对应八个Class对象

void 也有对应的class对象 Class cls1=void.class;

所以有九个基本的预定义的class对象

Method

方法与对象没有关系

调用某个对象上的方法

用反射怎样调用Strng 上的charAt()方法

MethodmethodCharAt=String.class.getMethod("charAt",int.class);

methodCharAt.invoke(str1,1);

2.用反射产生对象

String str3=(String)constructor1.newInstance(new StirngBuffer("abc")); 用构造方法产生对象

Stringstr2=(String)constructor.newInstance(new StringBuffer("abc"));

System.out.println(str2.charAt(2));

Class.newInstance();

class--constructor---newobject

反射会导致性能下降

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------详细请查看: www.itheima.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值