欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

java反射机制,java反射

来源: javaer 分享于  点击 38354 次 点评:18

java反射机制,java反射


Java反射机制

1、  反射机制

         Java的反射机制是java特性之一,反射机制是构建框架技术的基础所在。

         Java反射机制是指在运行状态中,动态获取信息以及动态调用对象的功能。

         Java反射有三个动态性质:

                  (1)    运行时生成对象实例

                  (2)    运行期间调用方法

                  (3)    运行时更改属性

2、  反射常用API

         使用java反射的类如下:

         Class类:反射的核心类,反射所有的操作都是围绕该类来生成的。通过Class,可以获取类的属性,

                             方法等内容信息。

         Field类:表示累的属性,可以获取和设置类中的属性的值

         Method:表示类的方法,它可以用来获取类中犯法的信息,或者执行方法

         Constructor类:表示类的构造方法

         在java中使用反射的基本步骤如下:

                  (1)    导入java.Lang.reflect.*

                  (2)    获得需要操作的类的java.lang.Class对象

                  (3)    调用Class的方法获取Field、Method等对象

                  (4)    使用反射API进行操作

3、  反射的应用

               5个:(1)    获取类的信息

                          (2)    创建对象

                          (3)    访问类的属性

                          (4)    访问类的方法

                          (5)    使用Array类动态创建和访问数组

                下面详细讲解:

          (1)    获取类的信息

                    >获取Class对象

                                 >>调用对象的getClass()方法

                                        Student p=new Student();

                                        Clsss cla=p.getClass();

                                 >>调用类的class属性

                                        Classcla=Student.class;

                                 >>使用Class类的forName()静态方法

                                        Classcla=Class.forName(“com.pb.java.reflection.Studnet”);

                    >从Class对象获取信息

                                         >>访问Class对应的类包含的构造方法

                                         >>访问Class对应的类包含的方法

                                         >>访问Class对应的类包含的属性

                                          ···

            (2)    创建对象

                                 方式:>使用Class对象的newInstance()方法创建对象(一般创建空参构造)。

                                 Classcla=Date.class;

                                 Date d=(Date)cla.newInstance();

                                 Sysout(“d.toString()”);

                                 >使用Constructor对象创建对象(一般创建带参构造)。

                                 Classcla=Date.class;

                                 Constructorcu=cla.getConstructor(long.class);

                                 Dated=(Date)cu.newInstance(1990);

                                Sysout(“d.toString()”);

 

              (3)    访问类的属性

                                 例子:访问类的私有属性,并赋值

                                 Class Student {

                                 Private String name;

                                 Private int age;

                                 Public StringtoString(){

                                 Return “名字是”+name+”年龄是”+age.

                                  }

                                  }

                                Main{

                                  Student s=new Student();

                                  Class cla=Student.class;

                                  Field nameField=cla.getDeclaredField(“name”);

                                  nameField.setAccessible(true);

                                  nameField.set(s,”li ming”);

                                  Field ageField=cla.getDeclaredField(“age”);

                                  ageField.setAccessible(true);

                                  ageFidle.setInt(s,20);

                                  }

                         注意:通常情况下,Student类的私有属性name和age只能在Student里访问,但示例代码

                          通过反射修改了Student对象的name和age属性值。在这里,没有用getField()方法来

                          获取属性,因为getField()方法只能获取public访问的权限的属性,而使用

                          getDeclaredField()方法则可是获取所有访问权限的熟悉性。

                          另外,为name和age赋值的方式不同,为name赋值使用了set(),而为age赋值则使用

                          了setInt()方法,因为前者是引用类型,或者为值类型(int);

           (4)    访问类的方法

                        使用Method对象可以调用对象的方法。在Methor类中包含了invoke()方法,方法定义如下:

                        Object invoke(Object obj,Object args)

                        其中,obj是执行该方法的对象,args是执行该方法时传入该方法的参数。

                        例子:通过反射调用Student类的方法。

                        Class Student {

                        Private String name;

                         Private int age;

                         //+get/set方法,此处略

                         Public String toString(){

                         Return “名字是”+name+”年龄是”+age.

 

                         }

                         }

                         Main{

                         Student s=new Student();

                         Class cla=Student.class;

                         Method met1=cla.getMethod(“setName”,String.class);

                         met1.invoke(s,”liming”);

                         Method met2=cla.getMethod(“getName”,null);

                        Object o=met2.invoke(s,null);

                        Sysout(o);

                         }

                        注意:如果把Student类的setName()的访问权限设置为私有,这是再运行程序,则会抛出

                        异常,所示的NoSuchMethodException异常。这是因为当通过Method的invoke()方法

                        调用对应的方法时,java会要求程序必须有调用该方法的权限。如果程序确实调用某个

                        对象的private方法,可以先调用,setAccessible方法,将Method对象的Accessible标

                        志设置指示的布尔值。值为true时,则表示改Method在使用时应该取消java语言访问权

                        限检查。

              (5)    使用Array类动态创建和访问数组

                        Object arr=Array.newInstance(String.class,10);

                        Array.set(arr,5,”jake”);

                        Array.set(arr,6,”john”);

                        Object o1=Array.get(arr,5);

                        Object o2=Array.get(arr,6);

相关文章

    暂无相关文章
相关栏目:

用户点评