---------------------- <a href="http://edu.youkuaiyun.com"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.youkuaiyun.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
一、 什么是反射?
反射就是把java类中的属性和方法等各种成分映射到相应的java类中。
Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class。
Java类用于描述一类事物的共性,该类事物有什么属性,没有什么属性,至于这个属性的值是什么,则是由这个类的实例对象来确定的,实例对象有不同的属性值。Java程序中的各个Java类,它们是否属于同一类事物,是不是可以用一个类来描述这类事物呢?这个类的名字就是Class,要注意是大写的C开头。Class类描述的的信息是:类的名字、类的访问属性、类所属的的包名、字段名称的列表、方法名称的列表等等。
Class类代表Java类,它的各个实例对象又分别对应什么呢?
对应各个类在内存中的字节码,例如,Person类的字节码,ArrayList类的字节码等等。一个类被类加载器加载到内存中,占用一片内存空间,这个空间里面的内容分别用一个个的对象来表示,这些对象显然具有相同的类型,这个类型是什么呢?
如何得到各个字节码对应的实例对象(Class类型)
(1) 类名.class;例如String.class
(2) 对象.getClass(),例如,new Data().getClass()
(3) Class.forName(“完整类名”),例如,Class.forName(“java.util.Data”)
反射:
通常方法创建实例对象:
String str = new String(new StringBuffer("abc"));
反射方法创建实例对象:
String str = (String)constructor.newInstance(new StringBuffer("abc"));
升级反射:
String str = (String)Class.forName("java.lang.String").newInstance();
这是调用String类的无参构造方法实现反射方式的实例化
Constructor<String> con = String.class.getConstructor(StringBuffer.class);
String str1 = (String)con.newInstance(new StringBuffer("lsk"));
System.out.println(str1);
publicclass ReflectDemo1
{
publicstaticvoid main(String[] args) throws Exception
{
//创建String对象
String str = "lsk";
//以不同方式获得String的Class
Class c1 = str.getClass();
Class c2 = String.class;
Class c3 = Class.forName("java.lang.String");
//观察不同方式获得的Class对象是不是相等
System.out.println(c1==c2); //true
System.out.println(c1==c3); //true
//是否是原始数据类型
System.out.println(c1.isPrimitive());
//获取int型的Class
System.out.println(int.class);
System.out.println(int[].class);
//验证整型数组是否是原始数据
System.out.println(int[].class.isPrimitive());//false
//验证整型数组是否是数组类型
System.out.println(int[].class.isArray());//true
//比较int与integer的区别
System.out.println(int.class == Integer.TYPE);
System.out.println(int.class == Integer.class);
//升级的反射调用无参构造方法创建实例对象
Constructor<String> con = String.class.getConstructor(StringBuffer.class);
String str1 = (String)con.newInstance(new StringBuffer("lsk"));
System.out.println(str1);
}
}
利用反射获取对象的属性,并对其进行操作
用到的方法:
Class中的方法:
1、 Field getField(String name) 返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段
2、Field getDeclaredField(String name) 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段
Field类中的方法:
1、 Class<?> getType() 返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型
2、 void set(Object obj, Object value) 将指定对象变量上此 Field 对象表示的字段设置为指定的新值
publicclass ReflectDemo2
{
publicstaticvoid main(String[] args) throws Exception
{
//创建reflect对象
reflect r = new reflect(8, 9);
//获取reflect对象的字段对象
Field fieldy = r.getClass().getField("y");
//获取reflect对象的y字段的值
Object y = fieldy.get(r);
//如果是x字段这样做的话运行会出错,因为x是private
System.out.println(y.toString());
//x字段应该这样做
Field fieldx = r.getClass().getDeclaredField("x");
fieldx.setAccessible(true);
System.out.println(fieldx.get(r));
}
---------------------- <a href="http://edu.youkuaiyun.com"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.youkuaiyun.com"target="blank">.Net培训</a>、期待与您交流! ----------------------