黑马程序员技术交流社区
标题:
19第一帖?先来个问题
[打印本页]
作者:
黑马潘浩
时间:
2013-3-27 12:45
标题:
19第一帖?先来个问题
本帖最后由 黑马潘浩 于 2013-3-27 16:11 编辑
内省操作到底指的是什么?
作者:
黄玉昆
时间:
2013-3-27 13:48
IntroSpector:即内省,是对内部进行检查,了解更多的底层细节。
内省的作用:主要针对JavaBean进行操作。
具体请看张老师的高新技术视频关于内省的讲解。
作者:
田磊阳
时间:
2013-3-27 13:51
JavaBean代码演示了简单内省操作以及复杂内省操作 。
1、简单内省操作
package me.test;
import java.lang.reflect.*;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
public class IntroSpectorTest
{
public static void main(String []args) throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException
{
JavaBeanTest t=new JavaBeanTest() ;
t.setX(10);
PropertyDescriptor d=new PropertyDescriptor("X",JavaBeanTest.class);
setProperty(t, d);
Object val = getProperty(t, d);
System.out.println(val);
}
private static Object getProperty(JavaBeanTest t, PropertyDescriptor d)
throws IllegalAccessException, InvocationTargetException {
Method mr=d.getReadMethod() ;
Object val=mr.invoke(t);
return val;
}
private static void setProperty(JavaBeanTest t, PropertyDescriptor d)
throws IllegalAccessException, InvocationTargetException {
Method mw=d.getWriteMethod() ;
mw.invoke(t, 5) ;
}
}
class JavaBeanTest
{
private int x ;
public void setX(int x)
{
this.x=x ;
}
public int getX()
{
return this.x ;
}
}
2、复杂内省操作 BeanInfo类 Introspector类的使用
package me.test;
import java.lang.reflect.*;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
public class IntroSpectorTest
{
public static void main(String []args) throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException
{
JavaBeanTest t=new JavaBeanTest(10) ;
PropertyDescriptor d=new PropertyDescriptor("x",JavaBeanTest.class);
setProperty(t, d);
Object val = getProperty(t, d);
System.out.println(val);
}
private static Object getProperty(JavaBeanTest t, PropertyDescriptor d)
throws IllegalAccessException, InvocationTargetException, IntrospectionException {
BeanInfo beanInfo=Introspector.getBeanInfo(t.getClass()) ;
PropertyDescriptor pt[]=beanInfo.getPropertyDescriptors() ;
for(PropertyDescriptor tem:pt)
{
if(tem.getName().equals(d.getName()))
{
Method mr=tem.getReadMethod() ;
Object val=mr.invoke(t) ;
return val ;
}
}
return null;
}
private static void setProperty(JavaBeanTest t, PropertyDescriptor d)
throws IllegalAccessException, InvocationTargetException, IntrospectionException {
BeanInfo beanInfo=Introspector.getBeanInfo(t.getClass() ) ; //把JavaBeanTest的对象当做JavaBean看有什么信息封装在BeanInfo中
PropertyDescriptor [] pd=beanInfo.getPropertyDescriptors() ; //Get All Properties From BeanInfo Class
for(PropertyDescriptor tem:pd)
{
if(tem.getName().equals(d.getName()))
{
Method mw=tem.getWriteMethod() ;
mw.invoke(t, 50) ;
break ;
}
}
}
}
class JavaBeanTest
{
private int x ;
public JavaBeanTest(int x)
{
this.x=x ;
}
public void setX(int x)
{
this.x=x ;
}
public int getX()
{
return this.x ;
}
}
作者:
赵家阳
时间:
2013-3-27 13:56
在java的反射中,所有的类被抽象出一个类,即Class类,这样我们就可以在程序运行的过程中通过配置文件,动态的加载类。但是在用反射的时候有些前提,就是:当我们调用有参的constructor的时候必须先知道构造函数传入的参数是什么类型;调用Method的时候必须先知道成员函数传入的参数是什么类型;调用field的时候必须先知道成员变量的类型。但是在某些情况下,一个类中的成员属性的名字对外是不可见的,这时候我们只可以得出他的成员类型的数组field[],在不知道确切变量名的情况下不可以定位到确切的变量上。而他提供了对这个属性公开的读(get)、写(set)方法, 虽然方法名和方法操作的对象有时候有很大的关系,但是我们不能保证这个关系一定成立。而且这种只提供get、set方法,不提供变量名的情况还很常见,因此java就将这种抽象为javabean类,对javabean类的操作,通过get、set函数后面的名字就“拟”得出变量的名字。通过这个名字,我们可以确切的求出某个变量的值。而对javabean的操作是通过内省(introspector)来完成的。
建议:不明白可以去看看张孝祥老师的相关视频。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2