代理
1为什么需要代理?
答:有重复代码,可以利用代理实现,简化代码。
静态代理代码示例:
package daili;
//接口Subject
interface Subject {
public void out();
public void in();
}
//Subject实现类 真实类
class realsubject implements Subject{
public void out() {
System.out.println("出去吃饭"); }
public void in() {
System.out.println("吃饭回来");}
}
class proxysubject{ //代理类
private Subject subject;
public proxysubject(Subject subject) {
super();
this.subject = subject;
}
public void invoke(String flag) {//执行真实类的方法(辅助方法和调用真实类的方法)
System.out.println("开门");
if("out".equals(flag)) {
this.subject.out();
}
else if("in".equals(flag)) {
this.subject.in();
}
System.out.println("关门");
}
}
public class test{
public static void main(String[] args) {
proxysubject tt=new proxysubject(new realsubject());//使用代理类
tt.invoke("in");
}}
//该示例 包括一个接口,一个 接口的实现类,一个代理类(包含一个构造方法用来创建接口的实现对象,包含一个代理方法(包括辅助方法和调用实现类的方法))
2静态代理缺点。
答:静态代理高度依赖主题类,耦合性高,由此引入动态代理。
一个动态代理示例:
package daili0;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//接口
interface Subject{
public void out();
public void in();
}
//接口的实现类
class RealSubject implements Subject{
public void out() {
System.out.println("出去吃饭");
}
public void in() {
System.out.println("吃饭回来");
}}
//动态代理类 实现invocationHandler
class SubjectProxy implements InvocationHandler{
private Object obj;
public SubjectProxy() {
}
public SubjectProxy(Object obj) {
this.obj=obj;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("打开门");//辅助方法
Object result=method.invoke(obj, args);//反射调用真实主题类的方法
System.out.println("关门");//辅助方法
return result;
}
}
public class test01{
public static void main(String[] args) {
Subject subject=new RealSubject();
InvocationHandler handler=new SubjectProxy(subject);
Subject pSubject=(Subject)Proxy.newProxyInstance(handler.getClass().getClassLoader(),
subject.getClass().getInterfaces(), handler);
pSubject.out();
System.out.println("293939");
}
}//动态代理的好处消除了静态代理耦和性高这一缺点