黑马程序员技术交流社区

标题: 反射的强大!!! [打印本页]

作者: xiaodaodan    时间: 2015-5-19 22:45
标题: 反射的强大!!!
今天刚碰到的一个题.自我感觉 很霸气,绕过编译赋值,你敢信!!!
      看题  : ArrayList<Integer> list = new ArrayList<Integer>();在这个泛型为Integer的ArrayList中存放一个String类型的对象。
  1. public class Nb {
  2.         public static void main(String[] args) th<span style="line-height: 2.2em;">rows Exception {</span>
复制代码




作者: xiaodaodan    时间: 2015-5-19 22:47
我的代码怎么变成这个样子了!!!
作者: xiaodaodan    时间: 2015-5-19 22:52
我重新发下代码吧,郁闷了...
public class Test2 {
        public static void main(String[] args) throws Exception {
                //创建ArrayList集合对象
                ArrayList<Integer> list = new ArrayList<Integer>();
                //使用集合对象调动getClass方法,获取字节码对象所对应的类,再获取集合的add方法
                Method methodAddString = list.getClass().getMethod("add", Object.class);
                //使用集合中的add方法对象,调用invoke方法,让集合对象使用add方法向集合中添加字符串元素
                methodAddString.invoke(list, "String类型");
                //输出集合中存入的字符串
                System.out.println(list);
        }
}
作者: Sou男人    时间: 2015-5-19 22:58
三军可夺帅也,匹夫不可夺其志也!!!
作者: 大西洋    时间: 2015-5-20 07:20
绕过编译?? 这段代码不用编译就能看到结果吗??  ctrl_F11 也不用按吗?
作者: 姬光普    时间: 2015-5-20 09:11
反射的确很是强大
作者: rolan    时间: 2015-5-20 09:12
赞一个,昨天也在弄这个
作者: kingowe    时间: 2015-5-20 09:16
不错,顶一个
作者: 想要那片海    时间: 2015-5-20 09:23
xiaodaodan 发表于 2015-5-19 22:52
我重新发下代码吧,郁闷了...
public class Test2 {
        public static void main(String[] args) throws Excep ...

如果要添加很多元素,就要调用很多次invoke吗?
作者: lizhi    时间: 2015-5-20 09:25
对呀,同时也很难学
作者: Always,    时间: 2015-5-20 09:59
  学习了、
作者: 志行    时间: 2015-5-20 10:12
受教了,我感觉就是反射仪这部分比较难,其他部分都学得差不多了
作者: qinhaihang    时间: 2015-5-20 10:24
有没有反射内容的资料呀
作者: sxsxsx    时间: 2015-5-20 10:40
确实要好好学习反射这部分内容啊

作者: 菜鸟的求学路    时间: 2015-5-20 12:05
xiaodaodan 发表于 2015-5-19 22:52
我重新发下代码吧,郁闷了...
public class Test2 {
        public static void main(String[] args) throws Excep ...

好吧   强大的程序能不能多给些金币
作者: Mr7952    时间: 2015-5-20 12:11
表示还没有学到
作者: guojiadui    时间: 2015-5-20 13:20
我在想,可以用在什么地放
作者: 傲凡玉蝶    时间: 2015-5-20 14:33
很好,很强大。。。。
作者: 汪汪    时间: 2015-5-20 16:34
反射感觉好复杂  好麻烦的样子,比较喜欢网络编程,
作者: 彭越    时间: 2015-5-20 16:55
反射是很强大的
作者: 彭越    时间: 2015-5-20 16:56
反射是很强大的
作者: 嘎嘎鸭子    时间: 2015-5-20 23:28
强大的框架离不开反射
作者: xiaodaodan    时间: 2015-5-21 16:29
大西洋 发表于 2015-5-20 07:20
绕过编译?? 这段代码不用编译就能看到结果吗??  ctrl_F11 也不用按吗? ...

加泛型限制了数据类型,在编译过程就会报错,,,但是这个可以做到加入了不是泛型约束的数据后还是可以通过编译的.
作者: xiaodaodan    时间: 2015-5-21 16:31
姬光普 发表于 2015-5-20 09:11
反射的确很是强大

可以更强大,不过貌似在开发中不咋的用...
作者: xiaodaodan    时间: 2015-5-21 16:46
嘎嘎鸭子 发表于 2015-5-20 23:28
强大的框架离不开反射

努力学习中...
作者: lingda21    时间: 2015-5-21 18:32
暴力反射确实强大 ,哈哈
作者: 纯情花心男    时间: 2015-5-21 19:06
表示还没学到........
作者: rick1991chen    时间: 2015-5-21 20:24
绕过编译是怎么做到的,不编译能运行啊?
作者: lanbo    时间: 2015-5-21 20:37
认真学习了一下。
作者: xiaodaodan    时间: 2015-5-24 21:16
rick1991chen 发表于 2015-5-21 20:24
绕过编译是怎么做到的,不编译能运行啊?

nonono,只是说添加字符串是绕过编译期做的
作者: 虎鹏    时间: 2015-5-24 21:21
完了啊!!加油!!!
作者: 笑爷    时间: 2015-5-24 21:52
学习了。。
作者: 精灵来了    时间: 2015-5-24 23:25
拜读了,还没到这里来
作者: h782205380    时间: 2015-5-24 23:51
很叼的样子,期待学习这部分知识
作者: 林思奇    时间: 2015-5-25 00:11
大神,膜拜
作者: 凉仁日记    时间: 2015-5-25 00:17
确实要好好学习反射这部分内容啊
作者: guoyangpeng    时间: 2015-5-25 06:51
反射实际工作中不常用
作者: lostaloneesk    时间: 2015-5-25 10:35
只要概念理解了,反射其实也就那么回事
作者: xiaodaodan    时间: 2015-5-25 10:44
lostaloneesk 发表于 2015-5-25 10:35
只要概念理解了,反射其实也就那么回事

啥都很简单的,就看你怎么应用了,思维要开阔
作者: xiaodaodan    时间: 2015-5-25 10:46
lingda21 发表于 2015-5-21 18:32
暴力反射确实强大 ,哈哈

这个还好   都没用暴力,,,真暴力起来那真是没得隐藏啊
作者: xiaodaodan    时间: 2015-5-25 11:22
想要那片海 发表于 2015-5-20 09:23
如果要添加很多元素,就要调用很多次invoke吗?

对头 ,就像调用add方法一样,添加几个就调用几次
作者: David19910809    时间: 2015-5-25 11:25
反射是牛叉的
作者: 爱李萝卜    时间: 2015-5-25 11:55
泛型是给编译器看的。所以通过反射是可以实现这种可能。这也是反射的一个不好的地方吧。Java本来是面向对象的,对对象实现了封装,结果通过反射又破坏了。不过人家的优点也是很棒的。
作者: Sou男人    时间: 2015-5-25 21:45
很不错的啦。
作者: 郭.威    时间: 2015-5-25 21:56
反射还没讲,以后有用吗
作者: haoguan10    时间: 2015-5-25 22:31
这个代码部分怎么弄出来的
作者: xiaodaodan    时间: 2015-5-26 08:51
haoguan10 发表于 2015-5-25 22:31
这个代码部分怎么弄出来的

下面有重发的代码,直接复制出来就好了
作者: xiaodaodan    时间: 2015-5-26 08:52
郭.威 发表于 2015-5-25 21:56
反射还没讲,以后有用吗

这个得看情况了.有的用有的不用,,我觉得吧还是好好看看吧,这玩意 很厉害的
作者: xiaodaodan    时间: 2015-5-26 18:42
guojiadui 发表于 2015-5-20 13:20
我在想,可以用在什么地放

我也在想,这个玩意是不可以干好多坏事
作者: xiaodaodan    时间: 2015-5-26 19:50
爱李萝卜 发表于 2015-5-25 11:55
泛型是给编译器看的。所以通过反射是可以实现这种可能。这也是反射的一个不好的地方吧。Java本来是面向对象 ...

对头,,,就是这个理...不过这个玩意还可以搞别人的文件呀
作者: YRDHelloworld    时间: 2015-5-26 21:07
反射还没有学       但看来应该挺难啊
作者: zhubingg    时间: 2015-5-26 22:01
反射是什么?  还没学到那呢? 感觉时间不够了啊!
作者: 雪域星辰    时间: 2015-5-26 22:19
html代码都出来了。。。
作者: 许鑫    时间: 2015-5-26 22:27

好流弊的赶脚。。。好
作者: jiatengde    时间: 2015-5-26 22:28
新人报道,正在努力中
作者: 雪域星辰    时间: 2015-5-26 22:28
这样也行吖。字节码文件也可以操作。。。
作者: xiaodaodan    时间: 2015-5-27 13:58
YRDHelloworld 发表于 2015-5-26 21:07
反射还没有学       但看来应该挺难啊

不难很简单,就是理解,这东东很有意思的
作者: Say丶懒羊羊    时间: 2015-5-27 14:33
哎.真的不知道说什么了. 感觉好难,  还是真的自己没心去看了.
作者: 王建伟    时间: 2015-5-27 17:19
以前就看过两遍反射看完也忘干净了,这几天还要再看。。。。。。。无奈
作者: 914360849    时间: 2015-5-27 22:02
确实,反射很重要
作者: xiaodaodan    时间: 2015-5-28 20:12
914360849 发表于 2015-5-27 22:02
确实,反射很重要

必须的,对于理解而言
作者: 开到荼靡    时间: 2015-5-28 20:54
<泛型>只是在java编译器会识别检查的一个东西, 你可以查看List原码当中并没有限定<integer>类型;
原码当中是<T> 意思是Object类型的都可以,Object又包涵integer;
所以你在通过反射的方式去掉add方法,编译器是查找的原码,原码又是<T>类型的泛型 所以你理应你传任何数据类型都可以。
作者: xiaodaodan    时间: 2015-5-29 08:48
开到荼靡 发表于 2015-5-28 20:54
只是在java编译器会识别检查的一个东西, 你可以查看List原码当中并没有限定类型;
原码当中是 意思是Objec ...

反射得到的不是字节码文件么,这个时候就和泛型没关系了.用反编译工具处理过后我就看不到泛型,所以我觉得他和object没多大关系...表示不理解
作者: 绝版坏银    时间: 2015-5-29 08:52
强大的跟我一样。。- -
作者: xiaodaodan    时间: 2015-5-29 08:55
绝版坏银 发表于 2015-5-29 08:52
强大的跟我一样。。- -

.................................................
作者: sjaiwl    时间: 2015-5-29 09:31
反射还没开始学。。。。。
作者: mmakun    时间: 2015-5-29 09:43
这有什么不一样的地方 吗
作者: 张海旭    时间: 2015-5-29 21:27
顶顶顶:victory:
作者: 小峰Raul    时间: 2015-5-29 21:30
反射这块好学吗 还没学到这
作者: !85684009ex    时间: 2015-5-29 22:11
膜拜大神!
作者: zuoyou    时间: 2015-5-29 23:10
反射看了还是迷迷糊糊的,,,
作者: xiaodaodan    时间: 2015-6-8 20:50
!85684009ex 发表于 2015-5-29 22:11
膜拜大神!

不难 ,这个以后老师要讲,我也是刚学了才知道原来是课堂的案例
作者: 追忆似水年华    时间: 2015-6-8 21:14
学习学习。
作者: 小车车    时间: 2015-6-8 21:20
学习了,来看看!
作者: xiaodaodan    时间: 2015-6-8 21:22
zuoyou 发表于 2015-5-29 23:10
反射看了还是迷迷糊糊的,,,

多看看  不难 理解了就好 ,没多少东西/
作者: yijian2033    时间: 2015-6-8 21:23
反射真的很强大,用处很大
作者: xiaodaodan    时间: 2015-6-16 22:43
彭越 发表于 2015-5-20 16:55
反射是很强大的

反射必须强大,,,,不知道这java能不能做个木马啥的
作者: xiaodaodan    时间: 2015-6-18 21:49
小车车 发表于 2015-6-8 21:20
学习了,来看看!

多来哦   有好礼相送:victory:
作者: 陌上桑    时间: 2015-6-18 22:21
本帖最后由 陌上桑 于 2015-6-18 22:24 编辑

    个人拙见:
  Arraylist作为导入包,加载类后,在内存中以class文件存在,通过class文件对象的getConstructor(Class<?>... parameterTypes)方法,产生对象。这个过程确实不需要编译。但是,似乎也没看到用处。 没记错的话,毕老师在讲多态,需要new一个子类对象作为参数才能调用方法时说:如果采用反射机制,会灰常方便。现在想起来,不就是通过类的class文件对象,产生对象嘛。而这个过程如果封装在原代码中,对于处理新加入的类,会变得非常方便。  这应该是他的强大之处。
作者: 十字天堂    时间: 2015-6-18 22:52
还没学到这里,看不懂{:3_55:}
作者: 腹黑生姜    时间: 2015-6-18 22:52
反射一直没懂
作者: yywishp    时间: 2015-6-18 23:05
顶一个,学习呀
作者: 冷雨敲窗被未温    时间: 2015-6-18 23:22
不错啊!!
作者: cztzc520    时间: 2015-6-18 23:36
666666666666666666
作者: 白水丶    时间: 2015-6-18 23:42
不是绕过了编译,而是Java中的泛型是伪泛型
作者: guiqulaixi    时间: 2015-6-19 09:16
楼上+1  java编译后会把泛型擦除,带有泛型的类原型就是Object
作者: Nemo    时间: 2015-6-19 10:04
还没学,看不懂啊
作者: wwb1105    时间: 2015-6-19 10:09
很好   学习学习
作者: java8023    时间: 2015-6-19 10:59
泛型只是编译的时候才会起作用的,只不过是不在编译期间赋值,可以说是绕过编译
作者: 宥美    时间: 2015-6-19 11:01
看上去很屌的样子
作者: xiaodaodan    时间: 2015-6-21 23:14
白水丶 发表于 2015-6-18 23:42
不是绕过了编译,而是Java中的泛型是伪泛型

怎么说呢  这个看每个人的理解呢   理解不一样  以后做出作品的风格也不一样的
作者: xiaodaodan    时间: 2015-6-21 23:15
腹黑生姜 发表于 2015-6-18 22:52
反射一直没懂

加油  多看看就好了   重在理解
作者: 给点正能量    时间: 2015-6-21 23:25
还没有学到,但很期待
作者: 王冲6060    时间: 2015-6-22 17:13
不错,顶一个!
作者: 景彬    时间: 2015-6-22 17:51
恩,案例很典型!:lol
作者: xiaodaodan    时间: 2015-6-22 20:18
景彬 发表于 2015-6-22 17:51
恩,案例很典型!

太典型了  最后老师还讲了...
考试也有哦
作者: 银哥    时间: 2015-6-22 20:42
学习一下
作者: 发抖的_DtYJA    时间: 2015-6-22 22:10
代码怎么变成这个样子了!!!
作者: 繁华落幕    时间: 2015-6-22 22:23
谢谢  分享
作者: zhao_HHH    时间: 2015-6-22 22:41
因为喜爱,所以选择,反射,我来了




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