黑马程序员技术交流社区
标题:
关于反射的问题
[打印本页]
作者:
wangkerui
时间:
2014-5-31 18:33
标题:
关于反射的问题
本帖最后由 wangkerui 于 2014-6-1 23:41 编辑
一个 Class 对象代表着一份字节码,相同类型的对象得到的字节码对象是同一个。
class Test
{
public static void main(String[] args) throws Exception
{
String s1 = "abc";
String s2 = "xyz";
Class c1 = s1.getClass();
Class c2 = s2.getClass();
System.out.println(c1==c2);
}
}
复制代码
程序运行的结果为 true 。印证了“相同类型的对象得到的字节码是同一个。”,但还是不明白,既然对象都不同,为什么仅仅因为类型相同就认为他们的字节码是同一个呢?
作者:
weimoliang
时间:
2014-5-31 18:38
因为他们属于同一个string 类型的数据
作者:
成小龙
时间:
2014-5-31 19:23
也许在虚拟机加载完代码后,里面只存一分相同类型的字节码
作者:
fenzheng
时间:
2014-5-31 19:28
只要是被虚拟机加载过的话,同一种类型的Class,就只有一份字节码
一:反射的基石
1:反射技术建立在jdk提供的Class类上,因此要掌握反射技术,首先要熟悉Class类。
2:通过Class类就可以得到java类中方方面面的内容<如:java类中的:构造方法(Constructor)、属性(field)、方法(method)>。
3:Class cls=?(?代表什么,你知道吗?)
注:?代表字节码
4:什么是字节码?
注:java代码编译的时候,将java源程序翻译成字节码<.class>存储到硬盘上,然后类加载器将字节码加载到jvm的内存中,生成一个又一个java对象。
5:得到字节码的三种方式:
String str1="abc"
Class cls1=str1.getClass();<通过对象得到字节码>
Class cls2=String.class;<通过类得到字节码>
Class cls3=Class.forName("java.lang.String");<通过包名得到字节码>
注:得到了一个类的字节码,那么就可以得到字节码的全部成分,下面将一一介绍.
6:同一类型的字节码相同吗?
System.out.println(cls1==cls2);返回:true
System.out.println(cls1==cls3);返回:true
注:说明同一类型的字节码只有一份,同一类型的字节码是相同的。
二:字节码的简单应用<检测数据的类型>
1: String str1="abc";
Class cls1=str1.getClass();
//测试String是否为基本类型的字节码,返回false;因为:String是一个类 System.out.println(cls1.isPrimitive());
2: //int是基本类型的字节码,返回true
System.out.println(int.class.isPrimitive())
3: //int是基本类型,Integer是类,因此返回:false
System.out.println(int.class==Integer.class);
4: //包装类型的基本类型的字节码比较,返回true
System.out.println(int.class==Integer.TYPE);
5://数组不是基本类型,返回false
System.out.println(int[].class.isPrimitive());
作者:
wangkerui
时间:
2014-6-2 07:27
fenzheng 发表于 2014-5-31 19:28
只要是被虚拟机加载过的话,同一种类型的Class,就只有一份字节码
一:反射的基石
1:反射技术建立在jdk提供 ...
谢啦,呵呵!
作者:
朱晓盼
时间:
2014-6-2 07:47
楼主的反射概念没搞清楚哦,getClass()获取的是字节码的类型,s1和s2的字节码类型都是String.class,所以他们相等,这和对象中的内容没有任何关系的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2