黑马程序员——反射

来源:互联网 发布:c语言速成手册 编辑:程序博客网 时间:2024/05/28 15:18
---------------------- 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
原创粉丝点击