javaBean

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:    属性值


你可能感兴趣的:(javaBean)