A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ò壞尛孩 中级黑马   /  2014-5-3 16:18  /  960 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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这个接口啊!
小弟有点迷惑!

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

4 个回复

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

我知道是多态啊!但是我不知道  动态代理  如何具体实现!
回复 使用道具 举报
{:3_50:}没人能回答的了我的问题吗?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马