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