黑马程序员技术交流社区
标题: java基础--反射 [打印本页]
作者: 周发建 时间: 2016-3-29 10:22
标题: java基础--反射
一、反射(一)概述反射主要应用于框架。
反射:就是把java类的各个组成部分映射成相应的java类【Field、Method、Contructor、Package】
反射就是对一个类进行解刨
一个类中的每个成员都可以用相应的反射API类的实例对象来表示;通过调用Class类的方法可以获得这些实例对象。
反射的基石:Class
对象.getClass(); //需要先创建未知对象
类.calss(); //需要使用到未知类
Class.forName(String); //传递字符串即可,推荐使用
isPrimitive(); //判断是否基本类型的字节码
isArray(); //判断是否是数组的字节码
newInstance(); //创建一个对象。提供一个便利创建对象的方式
数组的反射Array
getLength(Object obj); //获取数组的长度
get(Object obj,int index); //获取元素
构造函数
getConstructor();
getConstructor(Class<?>...);
函数
getMethod(String name, Class<?>...);
getMethods();
字段
getField(String);
getFields();
Type
getGenericInterfaces();
getGenericSuperclass();
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps753B.tmp.png
(二)模拟tomcat//模拟Tomcat
public static void myTomcat() throws Exception{
//1. 读取配置文件
Properties pro = new Properties();
pro.load(new FileReader("d:/pro.txt"));
Class clazz = Class.forName(pro.getProperty("className"));
if(clazz!=null){
USB usb = (USB) clazz.newInstance();
new TestUSB().run(usb);
}
}
//接口定义规范
interface USB{
public void start();
public void stop();
}
//前期开发的程序调用后期的实现
class TestUSB{
public void run(USB usb){
usb.start();
usb.stop();
}
}
//后期实现接口
//手机
class MPhone implements USB{
@Override
public void start() {
System.out.println("手机运行");
}
@Override
public void stop() {
System.out.println("手机停止");
}
}
//相机
class Camera implements USB{
@Override
public void start() {
System.out.println("相机运行");
}
@Override
public void stop() {
System.err.println("相机停止");
}
}
(三)内省 Introspector/**
* 用于操作javabean(特殊的java类:get/set)
*/
class MyBeanUtils{
//1. 反射操作bean
public static Object getProperties1(Object bean, String name) throws Exception{
Field f = bean.getClass().getDeclaredField(name);
f.setAccessible(true);
return f.get(bean);
}
public static void setProperties1(Object bean, String name, Object value) throws Exception{
Field f = bean.getClass().getDeclaredField(name);
f.setAccessible(true);
f.set(bean, value);
}
//2. 内省操作bean,复杂方式
public static Object getProperties2(Object bean, String name) throws Exception{
BeanInfo info = Introspector.getBeanInfo(bean.getClass());
PropertyDescriptor[] pds = info.getPropertyDescriptors();
for(PropertyDescriptor pd: pds){
if(pd.getName().equals(name)){
return pd.getReadMethod().invoke(bean);
}
}
return null;
}
public static void setProperties2(Object bean, String name, Object value) throws Exception{
BeanInfo info = Introspector.getBeanInfo(bean.getClass());
PropertyDescriptor[] pds = info.getPropertyDescriptors();
for(PropertyDescriptor pd: pds){
if(pd.getName().equals(name)){
pd.getWriteMethod().invoke(bean, value);
}
}
}
//3. 内省操作bean,简单方式
public static Object getProperties3(Object bean, String name) throws Exception{
PropertyDescriptor pd = new PropertyDescriptor(name, bean.getClass());
Method get = pd.getReadMethod();
return get.invoke(bean);
}
public static void setProperties3(Object bean, String name, Object value) throws Exception{
PropertyDescriptor pd = new PropertyDescriptor(name, bean.getClass());
Method set = pd.getWriteMethod();
set.invoke(bean, value);
}
}
(四)BeanUtilsSun公司的内省API过于繁琐,所以Apache结合很多实际开发中的应用场景开发了一套简单、易用的API,用于操作Bean的属性:BeanUtils
BeanUtils工具包常用类:
BeanUtils
PropertyUtils
ConvertUtils.regsiter(Converter convert, Class clazz);
自定义转换器
使用BeanUtils步骤
*1. 导入jar包
commons-beanutils-*.jar
commons-logging-*.jar
*2. 使用
getProperty(Object bean, String name);
setProperty(Object bean, String name, String value);
populate(Object bean,Map map);
Map describe(Object bean)
populate(Object bean, Map)
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |