动态代理j及JavaBean

动态代理

即通过代理类: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());
	}
}









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值