黑马程序员技术交流社区

标题: 反射和代理中的几个问题! [打印本页]

作者: ò壞尛孩    时间: 2014-5-3 16:18
标题: 反射和代理中的几个问题!
1、反射中:  类名.class 和 类对象.getClass()有什么区别!
2、        private static void changeStringValue(Object obj)throws Exception {                // TODO Auto-generated method stub
                //对字节码用==比 !专业!
                Field[] fields=obj.getClass().getFields();
                for(Field field:fields){
                        if(field.getType()==String.class){
                                String oldString=(String)field.get(obj);
                                String newString=oldString.replace('b', 'a');
                                field.set(obj, newString);        //将obj对象中的field变量值改成newString                       
                        }
                }
               
        }
红字部分field.getType()为啥不能用getClass(),这个getType返回的变量的包装类的字节码吗?
3、代理:
        private static Object getProxy(final Object target) {
                Collection proxy3=(Collection) Proxy.newProxyInstance(
                                target.getClass().getClassLoader(),
//                                new Class[]{Collection.class},
                                target.getClass().getInterfaces(),
                                new InvocationHandler(){
                                       
                                        public Object invoke(Object proxy,Method method,Object[] args)throws Throwable{
                               
                                                long beginTime=System.currentTimeMillis();
                                                Object retVal=method.invoke(target, args);
                                                long endTime=System.currentTimeMillis();
                                                System.out.println(method.getName()+" running time of "+(endTime-beginTime));
                                                return retVal;
                                        }
                                });
                return proxy3;
        }

[size=-1]static Object
newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
          返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。


红字部分,newProxyInstance第二个参数是传入的是目标类实现的接口吗?那么为啥         new Class[]{Collection.class},可以?        target.getClass().getInterfaces(),假如这里的target是Collection,这句表示Collection实现的接口,而不是Collection这个接口啊!
小弟有点迷惑!

作者: skill20    时间: 2014-5-3 16:27
反射有三种写法:
Class.forName(classname)        用于做类加载。
obj.getClass()                        用于获得对象的类型。
类名.class                            用于获得指定的类型,传参用。
作者: 焚雨成灰    时间: 2014-5-3 17:13
如果目标类能是接口的话,那么在匿名内部类中的invoke方法中的那句Object retVal=method.invoke(target, args);就不对了,接口中的方法都是抽象方法。况且,视频中的目标类是ArrayList。
代理类之所以能转成Collection,是因为代理类和目标类都实现了Collection,这是多态啊
作者: ò壞尛孩    时间: 2014-5-3 18:26
焚雨成灰 发表于 2014-5-3 17:13
如果目标类能是接口的话,那么在匿名内部类中的invoke方法中的那句Object retVal=method.invoke(target, ar ...

我知道是多态啊!但是我不知道  动态代理  如何具体实现!
作者: ò壞尛孩    时间: 2014-5-3 23:47
{:3_50:}没人能回答的了我的问题吗?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2