黑马程序员_java学习日记_Java高新技术_反射(一)

 

----------------------- android培训java培训java学习型技术博客、期待与您交流! ----------------------

java中的反射:

Class 可以看作是用来描述Java中类的类,体现类的共性,代表.class文件字节码。
每个字节码都是Class类的实例对象。
Person p1=new Person("p1");
person p2=new Person("p2");
编译后就产生字节码文件,当执行时类加载器就把字节码加载到Java虚拟机中,在内存中的每个字节码都是Class的一个实例;

得到Class实例的三种方法:
1:通过类名.class得到;
2:通过类的实例对象.getClass()方法得到;
2:通过Class的
public static Class<?> forName(String name,
                               boolean initialize,
                               ClassLoader loader)
                        throws ClassNotFoundException
方法得到,得到的class实例都是同一个
九个预定义的Class对象
int.class ;byte.class;short.class;char.class;long.class;folat.class;double.class;blooean.class;void.class;

在Java源程序中出现的类型都有对应的Class实例对象。


反射就是把Java类中的各种成分映射成相应的Java类。例如,一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的Java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Field,Method,Constructor,Package等等。一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示。我们应用反射的目的就是得到这些实例对象后应该它。

Constructor类:
该类无构造方法,有很多成员方法
 public int getModifiers()以整数形式返回此 Constructor 对象所表示构造方法的 Java 语言修饰符。应该使用 Modifier 类对这些修饰符进行解码。

public String getName()以字符串形式返回此构造方法的名称。它总是与构造方法的声明类的简单名称相同

public T newInstance(Object... initargs)
              throws InstantiationException,
                     IllegalAccessException,
                     IllegalArgumentException,
                     InvocationTargetException使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。个别参数会自动解包,以匹配基本形参,必要时,基本参数和引用参数都要进行方法调用转换。
如果底层构造方法所需形参数为 0,则所提供的 initargs 数组的长度可能为 0 或 null。
如果构造方法的声明类是非静态上下文的内部类,则构造方法的第一个参数需要是封闭实例;请参阅Java 语言规范 第 15.9.3 节。
如果所需的访问检查和参数检查获得成功并且实例化继续进行,这时构造方法的声明类尚未初始化,则初始化这个类。
如果构造方法正常完成,则返回新创建且已初始化的实例。
这是Constrctor最为重要的方法,该方法会抛出异常。

Filed类:
 代表某个类中的一个成员变量,不是对应具体的某个实例对象,得到某个类的字节码后可以通过{
public Field getField(String name)
               throws NoSuchFieldException,
                      SecurityException返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。name 参数是一个 String,用于指定所需字段的简称。
要反映的字段由下面的算法确定。设 C 为此对象所表示的类:

如果 C 声明一个带有指定名的公共字段,则它就是要反映的字段。
如果在第 1 步中没有找到任何字段,则该算法被递归地应用于 C 的每一个直接超接口。直接超接口按其声明顺序进行搜索。
如果在第 1、2 两步没有找到任何字段,且 C 有一个超类 S,则在 S 上递归调用该算法。如果 C 没有超类,则抛出 NoSuchFieldException。}
方法得到Field类的实例,尽可得到公有的字段

通过{public Field getDeclaredField(String name)
                       throws NoSuchFieldException,
                              SecurityException返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。name 参数是一个 String,它指定所需字段的简称。注意,此方法不反映数组类的 length 字段}得到所有字段

得到Field实例后调用Field类的
public Object get(Object obj)
           throws IllegalArgumentException,
                  IllegalAccessException 
方法取出字段的值

对于某些声明为private的字段必须 可以通过“暴力反射的方式得到该字段的值”该方式调用setAccessible(blooean args)方法把字段属性设置为可以访问即setAccessible(true)

 

 

----------------------- android培训java培训java学习型技术博客、期待与您交流! ----------------------

详情请查看:http://edu.csdn.net/heima

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值