静态代理:( 1个接口,2个实现类 ,1个真实类、1个代理类 N个接口,2*N个实现类 )
package test513a;
import java.lang.reflect.Constructor;
interface ISubject{
void eat();
}
class RealSubject implements ISubject{
@Override
public void eat() {
System.out.println("eat......");
}
}
class ProxySubject implements ISubject{
ISubject iSubject;
public ProxySubject(ISubject iSubject) {
this.iSubject = iSubject;
}
public void before() {
System.out.println("吃饭前");
}
public void after() {
System.out.println("吃饭后");
}
@Override
public void eat() {
before();
iSubject.eat();
after();
}
}
class Factory{
private Factory() {}
public static <T> T getInstance(String RealSubject) {
T t=null;
try {
t = (T)Class.forName(RealSubject).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return t;
}
public static <T> T getInstance(String proxy,String real)throws Exception {
T r = getInstance(real);
T t = null;
Constructor<?> cons = Class.forName(proxy).getConstructor(r.getClass().getInterfaces()[0]);
t = (T)cons.newInstance(r);
return t;
}
}
public class Test {
public static void main(String[] args) throws Exception {
ISubject subject = Factory.getInstance("test513a.ProxySubject", "test513a.RealSubject");
subject.eat();
}
}
动态代理:(1个接口,1个真实业务 N个接口,N+1个实现类)
1.动态代理需要实现 InvocationHandler 接口,实现invoke()方法
2.动态获取代理类对象 Proxy.newProxyInstance( );
package test513b;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface ISubject {
void eat(String name, int num);
}
class RealSubject implements ISubject{
public void eat(String name, int num) {
System.out.println("我要吃"+num+"份"+name);
}
}
interface IDreak {
void dreak(String name, int num);
}
class RealDreak implements IDreak{
@Override
public void dreak(String name, int num) {
System.out.println("我能喝"+num+"瓶"+name);
}
}
class ProxySubject implements InvocationHandler{
private Object target;
public Object bind(Object target) {
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}
public void beforeHandler() {
System.out.println("[ProxySubject]处理前");
}
public void afterHandler() {
System.out.println("[ProxySubject]处理后");
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
this.beforeHandler();
Object ret = method.invoke(this.target, args);
this.afterHandler();
return ret;
}
}
public class Test {
public static void main(String[] args) {
ISubject subject = (ISubject) new ProxySubject().bind(new RealSubject());
subject.eat("小龙虾", 20);
IDreak dreak = (IDreak) new ProxySubject().bind(new RealDreak());
dreak.dreak("啤酒", 15);
}
}
cglib动态代理:基于类的动态代理模式,可以没有接口。