动态代理
静态代理
代理设计:一个操作的接口有两个子类,其中一个是真实主题的实现类,另外一个是代理类,代理实现类要完成比真实主题实现类更多的内容,而且本身还需要处理一些与具体业务有关的程序代码
package dyncprocy;
public interface Subject {
public String say(String name,int age);//定义抽象方法say
}
package dyncprocy;
public class RealSubject implements Subject{ //实现接口
@Override
public String say(String name, int age) {
return "姓名: " + name + "年龄:" + age;
}
}
package dyncprocy;
public class ProxySubject implements Subject{
private Subject sub = null;
public ProxySubject(Subject sub) {
this.sub = sub;
}
@Override
public String say(String name, int age) {
return this.sub.say(name, age);
}
}
package dyncprocy;
public class DynaProxyDemo {
public static void main(String[] args) {
Subject sub = new ProxySubject(new RealSubject());
String info = sub.say("yue", 17);
System.out.println(info);
}
}
以上的代码操作实际上是成为静态代理,因为一个代理类只能为一个接口服务,那么如果现在有很多接口的话,那么肯定代理类就很多了,而且所有的代理操作,除了调用的方法不一样之外,其他的操作都一样,肯定是重复代码
因此Java就有了动态代理机制
动态代理
可以将invocationHandler接口的子类想象成一个代理的最终操作类,替换掉ProxySubject
public class MyInvocationHandler implements InvocationHandler{
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
}
ClassLoader表示类的加载器,在java中一般有三种
如果要得到一个加载器的对象,则肯定使用Class完成
package dyncprocy;
class p1{
}
public class ClassLoaderDemo {
public static void main(String[] args) {
p1 p = new p1();
System.out.println("类加载器:" + p.getClass().getClassLoader().getClass().getName());;
}
}
动态代理:
package dyncprocy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyInvocationHandler implements InvocationHandler{
private Object obj;
public Object bind(Object obj) {
this.obj = obj;//绑定真实主题类
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
this.before();
Object temp = method.invoke(this.obj, args);//调用方法
return temp;
}
public void before() {
System.out.println("在代理操作之前");
}
}
总结:
1、使用动态代理,可以完成代理的功能,而且可以代理全部的接口