静态代理
package test;
/**
* @author Lenovo
*/
public class Main {
public static void main(String[] args) {
proxy proxy = new proxy();
acting acting = new acting(proxy);
//通过代理类对象调用被代理类对象的方法
acting.produce();
}
}
/**
* 静态代理
* 代理类和被代理类在编译期间就确定下来了
*/
interface Method {
void produce();
}
//代理类
class acting implements Method {
private Method factory;
public acting(Method factory){
this.factory=factory;
}
@Override
public void produce() {
System.out.println("代理工厂做一些准备工作");
factory.produce();
System.out.println("代理工厂做一些后续工作");
}
}
//被代理类
class proxy implements Method {
@Override
public void produce() {
System.out.println("Nike工厂生产一批运动服");
}
}
动态代理
package test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author Lenovo
*/
public class Main {
public static void main(String[] args) {
Superman superman = new Superman();
//o代理类的对象
Human o = (Human)proxy.get(superman);
String belief = o.Belief();
System.out.println(belief);
o.eat("拉面");
}
}
/**
* 动态代理
* 1.根据加载到内存中的被代理类,动态的创建一个代理类及其对象
* 2.通过代理类的对象调用方法时,动态的去调用被代理类中的同名方法
*/
interface Human {
String Belief();
void eat(String food);
}
//代理类
class Superman implements Human {
@Override
public String Belief() {
return "fly";
}
@Override
public void eat(String food) {
System.out.println("我喜欢吃"+food);
}
}
//调用此方法返回一个被代理类对象
class proxy {
//obj被代理类的对象
public static Object get(Object obj){
invocation inv = new invocation();
inv.bind(obj);
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),inv);
}
}
class invocation implements InvocationHandler{
private Object obj;
public void bind(Object obj){
this.obj = obj;
}
//当我们通过代理类的对象调用方法时会自动调用invoke方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object invoke = method.invoke(obj, args);
return invoke;
}
}