内省总结

/**
* 内省:Introspector ,主要用于对javaBean进行操作,是JDK为操作javaBean提供的一整套API。
* 内省就是对javaBean类进行内部检查,检查出它到底有那些javaBean属性,公共方法等信息。
*
* 什么是javaBean?
* javaBean 是一个特殊的java类,是一个类中的某些方法需要符合某些规则的类。
* 这些规则就是:必须有一些以set和get打头的方法,比如:setXXX,getXXX。对于属性
* 并没有什么硬性的要求,大家约定的一般写法,就是成员变量都是私有的,get和set方法是公共的
*
* javaBean的作用:JavaBean应用非常广泛,尤其是在J2EE中,一般可以被用作软件的模块与模块之间的
* 信息传递,所以,这类javaBean对象又被成为值对象(即Value Object),值对象,顾名思义,就是以传递值为目标的对象,
* 对象中属性比较多,方法很少。主要就是为了传递这些字段。
*
* javaBean和普通的java类的关系:一个javaBean可以被当成为普通的java类来进行操作,一个java类也可以被当做javaBean来看待
* (包括那些类中没有get,set大头的方法的类,也可以被看成javaBean,只不过这个javaBean中没有任何属性)
*
* javaBean的属性:javaBean的属性不同于类的成员变量(类的属性),javaBean的属性的名称是以方法名的后缀来确定的,javaBean
* 的属性可以看成是get和set方法以及在外部看不到的私有成员变量的封装体。这个封装体有众多的信息,
* 用java.beans.PropertyDescriptor类来进行描述,其中就包括属性名这个信息。
* javaBean的属性名就是去掉开头的set,get,然后对剩余的部分,如果剩余部分的第二个字母不存在,或者存在且为小写字母
* ,就将开头的字母转成小写。否则,保持开头字母原样。javaBean的属性可以理解为在外部的人看起来,这个Bean应该有的
* 一个属性。
*
* javaBean的好处之一就是可以用内省的这套API来操作它,为开发节省了很多事情,更方便了
*
* 内省的API :Introspector类、BeanInfo类、PropertyDescriptor类,内省技术用到了反射技术
*
* BeanInfo类:用来描述将一个类看成是javaBean后,这个javaBean应该具有的信息。即这个类的对象中存储了一个java类被看成
* javaBean后所具有的所有细节信息。
*
*/

package cn.itcast.day25;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

//定义一个javaBean
class Person
{
	private int age ;
	private String name ;
	Person(int age ,String name)
	{
		this.age = age ;
		this.name = name ;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}

}
public class IntroSpectorTest {

	public static void main(String[] args)throws Exception {
		Person p = new Person(12,"lbx");

		String propertyName1 = "age" ;
		String propertyName2 = "name";
		Object retVal = null;
		Object value = "plj";
		int flag = 0;
		//较为复杂的内省使用方式
		BeanInfo beanInfo = Introspector.getBeanInfo(p.getClass());//获得javaBean的BeanInfo对象
		PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();//获得这个javaBean的所有属性
		for(PropertyDescriptor pd : pds)
		{
			if(pd.getName().equals(propertyName1))
			{
				retVal = getProperty(p,propertyName1); //抽取封装方法后的代码
				System.out.println(retVal);
				if(++flag == 2)
					break;
			}
			else if(pd.getName().equals(propertyName2))
			{
				retVal = getProperty(p, propertyName2);//抽取封装方法后的代码
				System.out.println(retVal);

				setProperty(p, propertyName2, value);
				if(++flag == 2)
					break;
			}
		}
		System.out.println(p.getName());

		//简便写法,内省的简单应用
		value = 15 ;
		setProperty(p, propertyName1, value);

		retVal = getProperty(p, propertyName1);
		System.out.println(retVal);

	}
	//抽取出的获得javaBean属性值的方法
	private static Object getProperty(Person p, String propertyName1)
			throws IntrospectionException, IllegalAccessException,
			InvocationTargetException {
		Object retVal;
		PropertyDescriptor pd2 = new PropertyDescriptor(propertyName1, p.getClass()); //获得属性描述对象
		Method getMethod = pd2.getReadMethod();//获得javaBean属性的get方法
		retVal = getMethod.invoke(p);//反射调用
		return retVal;
	}
	//抽取出的设置javaBean属性值的方法
	private static void setProperty(Person p, String propertyName1, Object value)
			throws IntrospectionException, IllegalAccessException,
			InvocationTargetException {
		PropertyDescriptor pd = new PropertyDescriptor(propertyName1, p.getClass());//获得属性描述对象
		Method setMethod = pd.getWriteMethod();//获得javaBean属性的set方法
		setMethod.invoke(p, value);//反射调用
	}

}

  

时间: 2024-11-11 04:52:24

内省总结的相关文章

JAVA中反射机制五(JavaBean的内省与BeanUtils库)

内省(Introspector) 是Java 语言对JavaBean类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则.如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(Value Object),或“VO”.方法比较少.这些信息储存在类的私有变量中,通过set().get()获得. 例如类UserInfo : package com.peidasoft.in

JAVAWEB开发之Session的追踪创建和销毁、JSP详解(指令,标签,内置对象,动作即转发和包含)、JavaBean及内省技术以及EL表达式获取内容的使用

Session的追踪技术 已知Session是利用cookie机制的服务器端技术,当客户端第一次访问资源时 如果调用request.getSession() 就会在服务器端创建一个由浏览器独享的session空间,并分配一个唯一且名称为JSESSIONID的cookie发送到浏览器端,如果浏览器没有禁用cookie的话,当浏览器再次访问项目中的Servlet程序时会将JSESSIONID带着,这时JSESSIONID就像唯一的一把钥匙  开启服务器端对应的session空间,进而获取到sessi

Java内省

大家都知道,Java给我提供了反射机制,使我们可以获取到每一个类的每一个属性和方法,并对此进行操作.但是利用反射来操作对象时过于麻烦,所以sun公司就基于反射机制给大家提供了一个更加简单实用的api,那就是内省(Introspector),而内省这套api将会使我们操作JavaBean的属性更加方便. 1.什么是Javabean? ①类必须是公共的 ②类必须具备无参构造器 2.什么是Javabean的属性? 要理解内省的概念,我们先来理解一下什么叫Javabean的属性,下面我们猜下该Javab

Java 内省 Introspector

操纵类的属性,有两种方法 反射 内省 面向对象的编程中,对于用户提交过来的数据,要封装成一个javaBean,也就是对象 其中Bean的属性不是由字段来决定的,而是由get和Set方法来决定的 public class Person { private String name ; private String password; private int age; public String getName() { return name; } public void setName(String

内省Introspector 和BeanUtils 工具对反射属性的包装(简单的不是一点点哦)

public void fun2() throws Exception { //通过反射和dom4j实例化id=stu1的对象,并输出 SAXReader reader = new SAXReader(); Document document = reader.read(this.getClass().getResourceAsStream("/beans.xml")); String xpath="/beans/bean[@id=\"stu1\"]&qu

内省(Introspector)

内省(Introspector) 是Java 语言对 JavaBean 类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则.如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为"值对象"(Value Object),或"VO".方法比较少.这些信息储存在类的私有变量中,通过set().get()获得. 例如类UserInfo : package

内省Introspector(反射操作javaBean)

一:内省是一种特殊的反射,来更方便的操作javaBean对象,通过内省可以获取到类字节码的描述器, 然后解剖每一个字段,获取每个字段的读写方法,即get/set方法的反射,然后获取或者是封装bean的value 下面是通过内省向Bean中set值得示例: public static <T> T toBean(T t){ Class<?> clazz = t.getClass(); try { //根据Class对象获取该类的BeanInfo信息 BeanInfo beanInfo

JavaWeb_内省(Instrospector)

内省是什么? 开发框架时,经常需要使用java对象的属性来封装程序的数据,每次都是用反射技术完成此类操作过于麻烦,所以sun公司开发了一套API,专门用于操作Java对象的属性. 什么是Java对象的属性和属性的读写方法? 内省访问JavaBean属性的两种方式: 1.通过ProperityDescriptor类操作Bean的属性: 2.通过Introspector类获得Bean对象的BeanInfo,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属

【DAY24】内省,NIO的学习笔记

java.lang.Class java.lang.reflect.Field java.lang.reflect.Method java.lang.reflect.Constructor //static代码块 Class.forName("",boolean , ClassLoader); JVM结构 ---------------- Ru.ntime Data Area 1.Method Area //方法区. 共享 2.Heap //存放对象和数组.共享 //Data acce

java学习之内省

反射加内省解决耦合问题 1 package com.gh.introspector; 2 /** 3 * JavaBean 4 * @author ganhang 5 * 6 */ 7 public class Dog { 8 private String name; 9 private int age; 10 public String getName() { 11 12 return name; 13 } 14 public void setName(String name) { 15 th