例1.静态代理
定义接口:Count.java
package proxy.StaticProxy;
//定义一个账户接口
public interface Count {
// 查看账户方法
public void queryCount();
// 修改账户方法
public void updateCount();
}
接口实现:CountImpl.java
package proxy.StaticProxy;
public class CountImpl implements Count {
@Override
public void queryCount() {
System.out.println("查看账户方法...");
}
@Override
public void updateCount() {
System.out.println("修改账户方法...");
}
}
代理类CountProxy.java
package proxy.StaticProxy;
// 这是一个代理类(增强CountImpl实现类)
public class CountProxy implements Count {
private CountImpl countImpl;
public CountProxy(CountImpl countImpl) {
this.countImpl = countImpl;
}
public void queryCount() {
System.out.println("事务处理之前");
// 调用委托类的方法;
countImpl.queryCount();
System.out.println("事务处理之后");
}
@Override
public void updateCount() {
System.out.println("事务处理之前");
// 调用委托类的方法;
countImpl.updateCount();
System.out.println("事务处理之后");
}
}
测试类 Test.java
package proxy.StaticProxy;
public class Test {
public static void main(String args[]) {
CountImpl countImpl = new CountImpl();
CountProxy countProxy = new CountProxy(countImpl);
countProxy.updateCount();
countProxy.queryCount();
}
}
运行结果:
事务处理之前
修改账户方法...
事务处理之后
事务处理之前
查看账户方法...
事务处理之后
例2.动态代理
Animal.java
package proxy.DynamicProxy_JDK_2;
public interface Animal {
public void info();
}
Cat.java
package proxy.DynamicProxy_JDK_2;
public class Cat implements Animal {
@Override
public void info() {
System.out.println("我是一只猫!!喵");
}
}
Handler.java
package proxy.DynamicProxy_JDK_2;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class Handler implements InvocationHandler {
private Object target;
public Handler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("被拦截的方法:" + method.getName());
System.out.println("预处理.........");
Object result = method.invoke(target, args);
System.out.println("善后处理........");
return result;
}
}
Test.java
package proxy.DynamicProxy_JDK_2;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Test {
public static void main(String[] args) {
// 委托对象
Animal animal = new Cat();
// 为animal制定一个调用处理器
InvocationHandler handler = new Handler(animal);
// 获得真实对象(animal)的一个代理类 ★★★★★
// 参数:(真实对象的类加载器,真实对象实现的所有接口,真实对象的处理器)
Object proxyObj = Proxy.newProxyInstance(animal.getClass()
.getClassLoader(), animal.getClass().getInterfaces(), handler);
// 应用代理对象
if (proxyObj instanceof Animal) {
System.out.println("proxyObj是animal!");
Animal animalProxy = (Animal) proxyObj;
animalProxy.info();// 像普通animal对象一样使用(通过handler的invoke方法执行)
} else {
System.out.println("proxyObj不是animal!");
}
}
}
运行结果:
proxyObj是animal!
被拦截的方法:info
预处理.........
我是一只猫!!喵
善后处理........