动态代理
即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生练习,而java动态代理主要是使用java.lamg.reflect包中的两个类
InvocationHandler类
public Object invoke(Object obj,Method method,Object[] obs)//代理类要执行的任务
其中第一个参数Obj指的是代理类,method是被代理的方法obs是被代理的方法的参数组,此方法由代理类来实现
动态代理其实是在运行时生成class,所以,我们必须提供一组interface,然后该诉他class已经实现了这些interface,而且在生成proxy的时候,必须给它提供一个handler,让他来接管实际的工作。
Subject接口
public interface Subject {
public void shopping();
}
Person类实现Subject接口
public class Person implements Subject{
public void shopping(){
System.out.println("付款,买到心仪的衣服");
}
public static void main(String[] args) {
}
}
创建一个动态代理类的类CreateProxy.java,实现了InvocationHandler接口
//用于动态生成一个代理对象的代理类
public class CreateProxy implements InvocationHandler{
private Object target;//被代理的对象
public Object create(Object target){
//用于创建代理对象的方法
this.target=target;
//第一个参数类加载器,第二个是你要代理对象的接口,第三个是自己
Object proxy=Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
return proxy;//代理对象
}
//代理对象要执行的方法,第一个参数代理类对象,第二个是要调用的方法shopping,第三个被代理对象方法的参数
public Object invoke(Object proxy,Method method,Object[] args)throws Throwable{
System.out.println("上海外寻找客户需要的产品......");
System.out.println("跟客户确认物品");
method.invoke(target, args);
System.out.println("完成本次海淘");
return null;
}
}
junit测试
public class TestDemo {
@Test
public void testProxy(){
CreateProxy cp=new CreateProxy();//用来创建代理对象的对象
Subject person=new Person();
Subject proxy=(Subject)cp.create(person);
proxy.shopping();//相当于调用invoke方法
}
}
动态代理只需要创建一个接口然后实现该接口中的方法即可,不需要在创建一个代理
public interface Hotel {
public void reserve();//酒店预订
}
public class Person implements Subject,Hotel{
public void shopping(){
System.out.println("付款,买到心仪的衣服");
}
public void reserve(){
System.out.println("预定付款,到达目的地");
}
public class TestDemo {
@Test
public void testProxy(){
CreateProxy cp=new CreateProxy();//用来创建代理对象的对象
Hotel person=new Person();
Hotel proxy=(Hotel)cp.create(person);
//proxy.shopping();//相当于调用invoke方法
proxy.reserve();
}
}
类加载过程分为三个步骤,装载,链接,初始化,链接又分为三个步骤
装载--------》链接(验证,准备,解析)---------》初始化
装载:查找兵家之类的二进制数据
链接:验证确保被加载类的正确行
准备:为类的静态变量分配内存,并将其初始化为默认值
解析把类中的符号引用转为直接引用
初始化:为类的静态变量赋予正确的初始值
2、类的初始化,类什莫时候才被初始化
(1)创建类的实力,也就是NEW一个对象
(2)访问某个类或接口的静态变量,或者对该静态变量赋值
(3)调用类的静态方法
(4)反射(Class.forName("Dog");
(5)初始化一个类的子类
(6)JVM启动时表名的启动类
3、类的加载
指的是类的.class文件中的二进制数据读入到内存中,将其放在允许你时数据区的方法区中,然后在堆取中创建一个这个类的java.lang.class对象,用来封装类在方法区类的对象
JavaBean
Bean理解为组建意思,javaBean就是java组件,在广泛的理解就是一个类,对于组件来说,关键在于要具有“能够被ide构建工具侦测其属性和事件”的能力,通常在java中。
JavaBean是使用Java语言开发的一个可重用的组件,在JSP的开发中可以使用JavaBean减少重复代码,使整个JSP代码的开发更简洁。JSP搭配JavaBean来使用,有以下的优点:
1.可将HTML和Java代码分离,这主要是为了日后维护的方便。如果把所有的程序代码(HTML和Java)写到JSP页面中,会使整个程序代码又多又复杂,造成日后维护上的困难。
2.可利用JavaBean的优点。将日常用到的程序写成JavaBean组件,当在JSP要使用时,只要调用JavaBean组件来执行用户所要的功能,不用再重复写相同的程序,这样以来也可以节省开发所需的时间。
一个javaBean要具备怎样的命名规则呢:
1、对于一个名称为xxx的属性,通常你要写两个方法:getxxx(),setxxx()任何浏览器内这些方法的工具,都会吧ge或set后面的第一个字母自动转换为小写
2、对于布尔型属性,可以使用以上get和set的方式,不过也可以把get替换成is
3、Bean的普通方法不必遵循以上的命名规则,不过他们必须是public的
4、对于事件,要使用Swing中监听器的方式,如addWindowListener,removeWindowListener
apache.org官网----》commons----->BeanUtil----->下载压缩包------》commons-beanutils-1.9.3.jar添加到工程下面,还需要那个jar包然后在下载添加。
public class Enp {
private String name;
private int age;
private int salary;
public String getInfo(){
return "name="+name+",age="+age+",salary="+salary;
}
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 int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
}
public class BeanTest {
@Test
public void test() throws IllegalAccessException{
//从客户端获取到的数据是这样的
String name="bin";
String age="18";
String salary="20000";
Enp enp=new Enp();
try{
BeanUtils.setProperty(enp, "name", name);
BeanUtils.setProperty(enp, "age", age);
BeanUtils.setProperty(enp, "salary", salary);
}catch(InvocationTargetException e){}
System.out.println(enp.getInfo());
}
}