静态代理举例
特点:代理类和被代理类在编译期间就确定下来
package com.java3;
interface ClothFactory{
void produceCloth();
}
/**
* 代理类
*/
class ProxyClothFactory implements ClothFactory {
private ClothFactory factory; //用被代理类对象进行实例化
public ProxyClothFactory(ClothFactory factory) {
this.factory = factory;
}
@Override
public void produceCloth() {
System.out.println("代理工厂做一些准备工作");
factory.produceCloth();
System.out.println("代理工厂做一些后续的收尾工作");
}
}
/**
* 被代理类
*/
class NikeClothFactory implements ClothFactory{
@Override
public void produceCloth() {
System.out.println("Nike工厂生产一批运动服");
}
}
public class StaticProxyTest {
public static void main(String[] args) {
// 创建被代理类的对象
ClothFactory nike = new NikeClothFactory();
//创建代理类的对象
ClothFactory profactory = new ProxyClothFactory(nike);
profactory.produceCloth();
}
}
动态代理
* 要想实现动态代理,需要解决两个问题 * 问题一:如何根据加载到内存中的被代理类,动态的创建一个代理类及其对象。 * 问题二:当通过代理类的对象调用方法a时,如何动态的去调用被代理类中的同名方法a。
package com.java3;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 动态代理的举例
*/
class ProxyFactory{
/**
* 调用此方法,返回一个代理类的对象
* @param obj 被代理类的对象
* @return 代理类对象类型(动态造的代理类)
*/
public static Object getProxyInstance(Object obj) {
MyInvocationHandler handler = new MyInvocationHandler(obj);
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),handler);
}
}
class MyInvocationHandler implements InvocationHandler{
private Object obj;
public MyInvocationHandler(Object obj) {
this.obj = obj;
}
// 当我们通过代理类的对象调用方法a时,就会自动的调用如下的方法:invoke()
// 将被代理类要执行的方法a的功能就声明在invoke()方法中
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// method:为代理类对象调用的方法
// 此方法也就作为了被代理类对象要调用的方法
// obj:被代理类的对象
Object invoke = method.invoke(obj, args);
return invoke;
}
}
public class ProxyTest {
public static void main(String[] args) {
NikeClothFactory nikeClothFactory = new NikeClothFactory();
ClothFactory proxyInstance1 = (ClothFactory) ProxyFactory.getProxyInstance(nikeClothFactory);
proxyInstance1.produceCloth();
}
}