代理模式:
我们先理解下面几个类,或许对你有所帮助。
1.InvocationHandler
在代理模式中我们需要实现该接口。该接口有一个方法invoke()方法,如下:
参数理解:
proxy:需要被调用的代理对象
method:代理对象的方法。
args:代理对象方法的参数。
大家可能在想,为什么一个类中有参数,有构造方法,有get和set器,有类名,有实现接口,父类等等,这里只有三个参数?
其实代理模式调用的是接口,接口有方法,接口名,接口的属性,方法的参数,所以invoke方法的参数可以满足代理。
2.Proxy
Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。
废话不多说了 直接上代码分析。
Subject接口包含say方法,方法中有name和age属性。
输出结果:
shenyc -- 2
----------
shenyc 21
shenyc -- 22
我们先理解下面几个类,或许对你有所帮助。
1.InvocationHandler
在代理模式中我们需要实现该接口。该接口有一个方法invoke()方法,如下:
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
参数理解:
proxy:需要被调用的代理对象
method:代理对象的方法。
args:代理对象方法的参数。
大家可能在想,为什么一个类中有参数,有构造方法,有get和set器,有类名,有实现接口,父类等等,这里只有三个参数?
其实代理模式调用的是接口,接口有方法,接口名,接口的属性,方法的参数,所以invoke方法的参数可以满足代理。
2.Proxy
Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。
废话不多说了 直接上代码分析。
package org.shen.proxy;
public interface Subject {
public String say(String name,int age);
}
Subject接口包含say方法,方法中有name和age属性。
package org.shen.proxy;
public class RealSubject implements Subject{
@Override
public String say(String name, int age) {
return name + " -- " + age;
}
}
package org.shen.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyInvocationHandler implements InvocationHandler{
private Object obj = null;
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 {
Object temp = method.invoke(obj, args);
return temp;
}
}
package org.shen.proxy;
public class TestProxy {
public static void main(String[] args) {
//使用代理
MyInvocationHandler demo = new MyInvocationHandler();
Subject sv = (Subject)demo.bind(new RealSubject());
String info = sv.say("shenyc", 2);
System.out.println(info);
System.out.println("----------");
//不使用代理
//如果不使用代理,就会去实现接口Subject,即创建一个实现类
//使用代理的话直接到代理那儿去拿接口。
Subject s = new Subject() {
@Override
public String say(String name, int age) {
return name + " " +age ;
}
};
String infoa = s.say("shenyc", 21);
System.out.println(infoa);
//new一个实例
Subject ss = new RealSubject();
String infob = ss.say("shenyc", 22);
System.out.println(infob);
}
}
输出结果:
shenyc -- 2
----------
shenyc 21
shenyc -- 22