原创作品,允许转载,转载时请务必以超链接形式标明文章
原始出处 、作者信息和本人声明。否则将追究法律责任。
作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui0317/article/details/7881433
作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui0317/article/details/7881433
一、什么是反射?
反射就是可以通过一个类的完整类名来动态完成该类的一系列操作,比如动态完成实例化,动态获取属性,动态获取方法,以及动态调用该类的方法。
二、每一个类或类的对象都有自己的class对象,那么这些类如何获得自己的class对象呢?
(1)如果是一个类,可以通过.class属性拿到class对象
(2)如果是一个类的对象,可以通过getClass()拿到class对象
(3)如果是一个包装类,可以通过.TYPE拿到class对象
三、如何实现反射?
//加载类,返回class对象 任何一个类都有自己的class对象
Class class1= Class.forName("com.chenghui.entity.Person");
Constructor c =class1.getConstructor(String.class,int.class,int.class,String.class);
//调用有参数的构造方法
Object obj=c.newInstance("chenghui",1,1,"123123");
//调用无参的构造方法,动态创建该类实例
//Object obj = class1.newInstance();
//获取该类的所有共有属性
Field[]fields = class1.getFields();
//获取该类的所有属性
Field[]declaredFields = class1.getDeclaredFields();
//获取该类的所有方法
Method[]methods = class1.getMethods();
for(Field field :declaredFields){
System.out.println(field);
if(field.getName().equals("sex") ){
//是否允许为私有属性赋值
field.setAccessible(true);
field.set(obj,"男");
}
}
for(Method method :methods){
System.out.println(method);
if(method.getName().equals("show")){
method.invoke(obj);//调用
}
}
四、说说反射的好处?
(1)反射,使程序变得非常灵活,非常强大,可以不同加载该类就可以完成实例化工作,并且提供动态调用其属性和方法的功能。
( 2 )缺点是 通过反射 是程序性能降低,再就是如果太多类都是用反射这使得程序变得很臃肿,不利于后期的维护。