JavaBean是使用Java语言开发的一个可重用的组件本质是一个Java类
编码规范:
1.他必须是一个公共的,无参的构造方法(可以是编译器自动产生的默认构造方法)。
2.它提供公共的setter方法和getter方法让外部程序设置和获取JavaBean的属性
反射
反射:reflect ,从类的外部去观察这个类(属性 方法 构造),没有源代码.java,拿到的是.class文件,反射源头就是Class类
a. 反射可以在知道类的全路径的情况下去实例化
b. 做工具软件 Eclipse中方法和属性提示
在Class类中本身没有定义非私有的构造方法,因此不能通过new直接创建Class类的实例
获取Class类的实例有三种方式
1.通过"对象.getClass()"方式获取该对象的Class实例
2.通过Class类的静态方法 forName()用类的全路径名获取一个Classs实例
3.通过类名.class的方式来获取Class实例,
对于基本数据类型的封装类还可以采用.Type来获取相对应的基本数据类型的Class实例
通过Class类的forName()的方法相比其他两种方法更灵活其他两种方法需要明确一个类
通过反射创建对象
通过无参构造方法实例化对象
//传入要实例化的完整的"包.类"名称
Class clazz = Class.forName("com.hhh.entity.Person");
//实例化Person对象
Person person = (Person)clazz.newInstance();
p.setName("哈哈");
System.out.println(p);
通过有参构造方法实例化对象
-----------通过有参通过有参构造方法实例化对象时需分三个步骤完成-----------
1.通过Class类的getConstructors()方法取得本类中的全部构造方法
2.向构造方法中传递一个对象数组进去,里面包含构造方法中所需的各个参数
3.通过Constructors类实例化对象(Constructors类表示的是构造方法)
Class clazz = Class.forName("com.hhh.entity.Person");
//通过反射获取全部构造方法
Constructors cons[] = clazz.getConstructors();
//向构造方法中传递参数并实例化Person对象
Person p = (Person)cons[0].newInstance("哈哈");
System.out.println(p);
通过反射访问属性
属性的操作是通过Field的类实现的,它提供的set()和get()方法分别用于设置和获取属性,需要注意的是如果访问的属性是私有的,则需要在使用set()和get()方法之前,使用Field类中的setAccessible()方法将需要操作的属性设置成可以被外界访问的
package com.hw.controller;
import java.lang.reflect.Field;
class Person {
private String name;
private int age;
public String toString() {
return "姓名:" + this.name + ",年龄:" + age;
}
}
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException,
IllegalAccessException, NoSuchFieldException, SecurityException {
// 获取Person对应的Class对象
Class clazz = Class.forName("com.hw.controller.Person");
// 创建一个Person对象
Person p = (Person) clazz.newInstance();
// 获取Person类中指定名称的属性
Field nameField = clazz.getDeclaredField("name");
// 设置通过反射访问该属性时取消权限检查
nameField.setAccessible(true);
// 调用set方法为指定对象的属性赋值
nameField.set(p, "哈哈");
Field ageField = clazz.getDeclaredField("age");
ageField.setAccessible(true);
ageField.set(p, 18);
System.out.println(p);
}
}
通过反射调用方法
获得Class对象后,就可以通过Class对象的getMethods()方法或者 getMethod()方法 获取全部防范或者指定方法这两个方法返回值分别是method对象和Method对象数组,在Method里包含一个invoke()方法
package com.hw.controller;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String helloWorld(String name ,int age) {
return name+":说:helloWorld-"+age+"岁";
}
}
public class ReflectDenon {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException,
IllegalAccessException, NoSuchFieldException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
// 获取Person对应的Class对象
Class clazz = Class.forName("com.hw.controller.Person");
//该方法中有两个形参
Method md = clazz.getMethod("helloWorld",String.class,int.class);
//调用helloworld()方法
String result = (String) md.invoke(clazz.newInstance(), "张三",18);
System.out.println(result);
}
}
内省
JDK中提供了一套API用来访问某个属性的getter()和setter()方法这就是内省
内省是Java语言对JavaBean类属性,事件,方法的一种标准处理方式,有效的减少代码量
内省访问JavaBean有两种方法
1.先通过Java.Beans包下的Introspector类获得JavaBean对象的beanInfo信息,
在通过BeanInfo来获取属性的描述器(PropertyDescriptor)获取某个属性对应
的getter和setter()方法,最后通过发射机制
2.Java.Beans包下的PropertyDescriptor类来操作Bean对象
jsp标签访问JavaBean
id: 用于指定JavaBean实例对象的引用名称和其存储在域范围中的名称
scope: 用于指定JavaBean实例对象的存储域范围
type: 用于指定JavaBean实例对象的引用的变量类型
class: 指定JavaBean的完整类型
beanName: 指定JavaBean的名称
可以创建JavaBean对象设置对象属性
id: 用于指定JavaBean实例对象的名称与的id属性值相同
property:用于指定JavaBean实例对象的属性名
name: 用于指定请求消息中参数的名字
value: 属性值