黑马程序员技术交流社区
标题:
张老师的代理,听得有点晕!求高手讲讲。
[打印本页]
作者:
花伟昌
时间:
2013-8-5 21:10
标题:
张老师的代理,听得有点晕!求高手讲讲。
本帖最后由 杨兴庭 于 2013-8-6 21:19 编辑
请教各位同学,关于代理的知识。
作者:
哪颗最亮的星星
时间:
2013-8-5 22:03
代理其实就是一个中介,本来你想买电脑要去北京的联想总部,但现在你只需要通过你们县城的代理商就可以买到了,一句话,方便。这里我写一个死的代理,也就是一个没有扩展的代理,哪么代码的代理实现如下:
Collection c=(Collection)Proxy.newProxyInstance(
Collection.class.getClassLoader(),
new Class []{Collection.class},
new InvocationHandler()
{
ArrayList<String> al=new ArrayList<String>();//目标
@Override
public Object invoke(Object proxy, Method method, Object [] args)throws Throwable
{
long start=System.currentTimeMillis();//系统功能
Object retVal=method.invoke(al,args);//代理去调用目标的方法
long end=System.currentTimeMillis();//系统功能
System.out.println(end-start);
return retVal;
}
});
c.add("abcd");
c.add("absd");
c.add("abdd");
c.add("abfd");
System.out.println(c);
作者:
白堇翎
时间:
2013-8-5 22:29
本帖最后由 白堇翎 于 2013-8-5 22:31 编辑
楼上已经把概念讲的很清楚了,我就来个封装好的代理类吧,可能具体的代码能帮助你更好的理解什么是"动态代理类"
package ProxyClass;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection;
/*
* 代理类练习
* */
public class ProxyTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
pro pro = new clspro();
Test3Proxy T3P = new Test3Proxy();
ArrayList al = new ArrayList();
Collection coll = (Collection)T3P.proxy(al, pro);
//随便添加点东西试试我的代理类
coll.add(123);
coll.add(123);
coll.add(123);
coll.add(123);
coll.add(123);
}
}
//一个封装好的代理类,直接往里传你自己想要的代理的类,增加的功能即可,前提是你的类必须实现pro接口
class Test3Proxy{
public Object proxy(final Object targent,final pro pro){
Object tar = Proxy.newProxyInstance(
targent.getClass().getClassLoader(),
targent.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
pro.before();
Object obj = method.invoke(targent, args);
pro.after();
return obj;
}
});
return tar;
}
}
//接口,用于声明要添加的功能
interface pro{
void before();
void after();
}
//随便写一个实现pro接口的类,随便添加点功能
class clspro implements pro{
long start;
long end;
@Override
public void before() {
// TODO Auto-generated method stub
start = System.currentTimeMillis();
}
@Override
public void after() {
// TODO Auto-generated method stub
end =System.currentTimeMillis();
System.out.println(end-start);
}
}
复制代码
作者:
佟都
时间:
2013-8-5 23:20
本帖最后由 佟都 于 2013-8-6 00:09 编辑
刚开始的时候,我也听晕了。
现在我是这么理解的:
所谓“动态代理类”的“动态”,是指代理类是动态生成的
//创建动态代理类(通过Proxy的静态方法getProxyClass)
public static void main(String[] args) {
//获取Collection接口的代理类
Class proxyClass = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
System.out.println("class name : "+ proxyClass.getName());
//对同一接口重复创建动态代理类,会返回先前已经创建好的代理类的类对象
proxyClass = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
System.out.println("class name : "+ proxyClass.getName());
//获取Map接口的代理类
Class proxyClass1 = Proxy.getProxyClass(Map.class.getClassLoader(), Map.class);
System.out.println("class name : "+ proxyClass1.getName());
//获取Comparator接口的代理类
Class proxyClass2 = Proxy.getProxyClass(Comparator.class.getClassLoader(), Comparator.class);
System.out.println("class name : "+ proxyClass2.getName());
}
复制代码
接下来是“动态代理类”中的“代理类”。上一步动态生成的代理类是要用来实现、调用被代理的接口(委托类)中的方法的。
这是通过实现InvocationHandler接口中的invoke(),来分派转发委托类的方法,并可在此增加原委托类中没有的方法。
//创建动态代理类对象并调用委托类中的方法
public static void main(String[] args) throws Exception {
//获取Collection接口的动态代理类
Class proxyClass = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
System.out.println("class name : "+ proxyClass.getName());
//通过反射机制获取动态代理类的构造方法
Constructor constructor = proxyClass.getConstructors()[0];
//通过构造方法创建动态代理类的实例
Collection proxy = (Collection)constructor.newInstance(
//InvocationHandler接口作为参数被传入
new InvocationHandler() {
//因为这里是委托类是Collection接口,可用ArrayList()对象来代替
ArrayList al = new ArrayList();
Object obj = null;
@Override
public Object invoke(Object proxy, Method method, Object[] args) {
System.out.println("委托类方法运行前……");
//委托类的方法运行
try {
System.out.println("正在运行"+ method.getName() +"()...");
obj = (Object) method.invoke(al, args);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("委托类方法运行后。");
return obj;
}
});
//通过动态代理类对象来调用委托类的方法
System.out.println("proxy.toString() = "+ proxy.toString());
proxy.add("haha");
proxy.add("hehe");
System.out.println("proxy.size() = "+ proxy.size());
System.out.println("proxy.toString() = "+ proxy.toString());
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2