(一)
(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)动态代理
- 在项目运行的时候创建一个代理对象,这种代理方式是动态代理
-
- Proxy类 :
Proxy.newProxyInstance()
- Proxy类 :
-
- 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