---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------
一、理解什么是反射
反射:
java反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法。对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
动态获取类中信息,就是java反射。可以理解为对类的解剖。反射大大提高功能扩展性。
Tomcat:
提供了处理请求和应答的方式。因为具体的处理操作不同,所以对外部提供了接口,有开发者来实现具体的请求和应答处理。
二、获取字节码文件对象
要想对字节码文件进行解剖,必须有字节码文件对象,如何获取字节码文件对象呢?
方式一:
1.object类中的getClass()方法的。
//想要用这种方式 必须明确具体类,并创建对象。
Person p=new Person();
Class clazz=p.getclass();
方式二:
2.任何数据类型都具备一个静态的属性,用class来获取其对应的Class对象。
Class clazz=Person.class;
方式三:
只要通过给定的类的字符串名称就可以获取该类,更为扩展。该方法是forName。
String className="cn.itcast.bean.Person";//类名前要加上包
Class clazz=Class.forName(className);
三、获取字段
获取字节码文件中的字段:Filed
String name="cn.itcase.bean.Person";
Class clazz=class.forNamr(name);
Filed filed=clazz.getFiled("age");
//Filed都只能拿到public,可以拿到父类的
Filed filed=clazz.getDeclaredFiled("age");
//只获取本类的,包含私有。
//对私有字段的访问取消检查。暴力访问。
filed.setAccessible(true);
Object obj=clazz.newInstance();
filed.set(obj,89);
四、获取构造函数
String name="cn.itcase.bean.Person";
//找寻该名称类文件,并加载内存,并产生Clas对象
Class clazz=class.forNamr(name);
//产生该类的对象
Object obj=clazz.newInstance();
//一般被反射的类都带空参
当获取指定名称对应类中的所体现的对象时:而该对象初始化不使用空差构造函数时该怎么办?既然是按照指定的构造函数进行初始化,所以要先获取该构造函数。通过字节码文件对象即可完成。该方法是:getConstructor(paramterTypes).
//获取到差数为String,int的构造函数
Constructor<T>con=clazz.getConstructor(String.class,int.class);
//通过该构造器对象的newInstance方法进行对象的初始化。
Object obj=con.newInstance("xiao",38);
五、获取函数
String name="cn.itcase.bean.Person";
Class clazz=class.forNamr(name);
Method[]methods=clazz.getMethod();//获得都是公共的
Method[]methods=clazz.getDeclaredMethod();//获取本类的所有方法
Method method=clazz.getMethod("show",null);//show函数名,获取空参的show();
Method method=clazz.getMethod("show",String.class,int,class);
//获取参数为String,int名为show的函数。
//运行函数
method.invoke();
六、数组反射的应用
已知一个数组,用反射把它每个元素打印出来?
import java.lang.reflect.Array;
public class Deom6 {
public static void main(String[] args)
throws ReflectiveOperationException, RuntimeException {
// TODO 自动生成的方法存根
int []arr={2,34,55,56};
printObject(arr);
}
private static void printObject(Object object) throws ReflectiveOperationException, RuntimeException {
// TODO 自动生成的方法存根
Class clazz=object.getClass();
if(clazz.isArray()){
int len=Array.getLength(object);
for (int i = 0; i < len; i++) {
System.out.println(Array.get(object, i));
}
}else{
System.out.println(object);
}
}
} System.out.println(object);
}
}
----- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://edu.csdn.net/heima" target="blank">http://edu.csdn.net/heima</a>