JavaWeb基础(12):代理☆

(一)

(1)静态代理

  • 在编译时已经将接口、被代理类、代理类确定下来的代理方式
    • 代理类持有被代理类的实例
    • 代理类和被代理类implements相同接口
  • 代理的好处
    • 可以对原类的方法进行加强

(1)Demo

  • 接口:
package Proxy;

/**
 * Person接口
 */
public interface Person {
	//上交班费
	void giveMoney();
}

  • 被代理类
package Proxy;

public class Student implements Person{
	private String name;
	public Student(String name){
		this.name = name;
	}

	@Override
	public void giveMoney(){
		System.out.println(name + "上交班费50$");
	}
}

  • 代理类
package Proxy;

/**
 * 学生代理类,保留了一个学生实体,这样就可以调用实体的方法
 */
public class StudentProxy implements Person{
	Student stu;

	public StudentProxy(Person stu){
		//只代理学生对象
		if(stu.getClass() == Student.class){
			this.stu = (Student) stu;
		}
	}

	//代理学生的交班费行为
	public void giveMoney(){
		//附加行为
		System.out.println("mio is in progress!");

		stu.giveMoney();
	}
}
  • 测试
package Proxy;

public class Main {
	public static void main(String[] args){
		Person s = new Student("mio");

		Person monitor = new StudentProxy(s);

		monitor.giveMoney();
	}
}

(2)动态代理

  • 在项目运行的时候创建一个代理对象,这种代理方式是动态代理
      1. Proxy类 : Proxy.newProxyInstance()
      1. Spring的cglib
  • 一个动态代理实例:

(1)Demo

  • 接口
package DynamicProxy;

public interface Car {
	void run();
	void stop();
}

  • 被代理类
package DynamicProxy;

public class SportsCar implements Car{
	@Override
	public void run() {
		System.out.println("Sports car runs");
	}

	@Override
	public void stop() {
		System.out.println("Sports car stops");
	}
}
  • 动态代理(使用匿名内部类)
package DynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Main {
	public static void main(String[] args){
		final SportsCar sc = new SportsCar();

		//sc.run();
		//sc.stop();

		Car SportsCarPro = (Car) Proxy.newProxyInstance(SportsCar.class.getClassLoader(), new Class[]{Car.class}, new InvocationHandler() {
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				//method.invoke(sc,null);
				if("run".equals(method.getName())){ //只加强特定的方法
					System.out.println("run faster");
				}
				return method.invoke(sc,null);
			}
		});

		SportsCarPro.run();
		SportsCarPro.stop();
	}
}

参考:https://www.cnblogs.com/gonjan-blog/p/6685611.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值