java反射机制运行状态中,对于任何一个类,都可以知道这个类所有属性和方法,对于任何一个对象,都可以调用它的任何一个方法,
这种动态获取信息或者动态调用功能称之为反射机制

获取Class的四种F方法:

例子:

                                                  //获取Class—getClass方法 
                                          test ts=new test();
                                       Class cl=ts.getClass();
                                          System.out.println(cl);
                                              //获取Class—Class.forName方法  
                                                 try {
                                                              Class cl=Class.forName("com.entity.test");
                                                              System.out.println(cl);
                                                    } catch (ClassNotFoundException e) {
                                                              // TODO Auto-generated catch block
                                                           e.printStackTrace();
                                                   }
                                              //获取Class—类名.class方法 
                                                             Class cl=test.class;
                                                             System.out.println(cl);
                                              //获取Class—包装类.type
                                                                        Class cl=Boolean.TYPE;
                                                                        System.out.println(cl);

推荐getclss方法和类名直接.class方法。
1.Filde类,获取成员属性

                                               //1.Filed类获取成员变量
                                              //2.获取Class
                                                        Class cl=test.class;
                                                        Object obj=cl.newInstance();
                                                        //获取指定对象
                                                        Field name=cl.getDeclaredField("name");
                                                        //公有化
                                                        name.setAccessible(true);
                                                        //拿到值
                                                        System.out.println(name.get(obj));

PS:文字说明【首先先拿到Class,然后通过test类中的无参构造函数来获取对象newInstance(),然后用Class获取名为name的属性,然后破坏封装 name.setAccessible(true); 然后通过Field对象从test对象Obj中拿到name name.get(obj)】
2)获取全部属性变量

                                                        //1.Filed类获取成员变量
                                              //2.获取Class
                                                        Class cl=test.class;
                                                        Object obj=cl.newInstance();
                                                        //获取指定对象
                                                        Field fields[]=cl.getDeclaredFields();
                                                        //循环里面的内容
                                                        for (Field field : fields) {
                                                                  System.out.println(field.getName());
                                                        }
1. 

获得Methods全部方法

                                                        //获取Class
                                                        Class cl=test.class;
                                                        Method me[]=cl.getDeclaredMethods();
                                                        for (Method method : me) {
                                                                  System.out.println(method.getName());
                                                        }
2)获得Method某个方法,不带参数
                                                        //获取Class
                                                        Class cl=test.class;
                                                        Object obj=cl.newInstance();
                                                        //调用ccc方法
                                                        Method me=cl.getDeclaredMethod("ccc",new Class[]{});
                                                        Object re=me.invoke(obj, new Object[]{});

3)获得Method某个方法,带参数

                                                        //获取Class
                                                        Class cl=test.class;
                                                        Object obj=cl.newInstance();
                                                        //调用ccc方法
                                                        Method me=cl.getDeclaredMethod("ccc",new Class[]{String.class,int.class});
                                                        Object re=me.invoke(obj, new Object[]{"谢振坤",88});

3.构造方法,获取全部无参构造方法

                                                        //获取Class
                                                        Class cl=test.class;
                                                        Object obj=cl.newInstance();
                                                        //调用构造方法
                                                        Constructor gz[]=cl.getConstructors();
                                                        for (Constructor constructor : gz) {
                                                                  System.out.println(constructor);
                                                        }

1)获取单独的构造方法,无参

                                                      Class cl=test.class;
                                                      Constructor gz=cl.getConstructor();
                                                        test t=(test) gz.newInstance();
                                                        System.out.println(t);

2)获取单独的构造方法,有参

                                                      Class cl=test.class;
                                                      Constructor gz=cl.getConstructor(String.class,int.class);
                                                      test t=(test) gz.newInstance("张三",67);
                                                       System.out.println(t);

4.反射ARR数组

                                                        //获取Class,这里定义arr的数据类型
                                                        Class cl=Class.forName("java.lang.Object");
                                                        Object arr=Array.newInstance(cl, 5);
                                                        //通过reflact包中的Array来设置名为arr,第3个值为5
                                ![下载.jpg][1]                        Array.set(arr, 3, 5);
                                                        //通过reflact包中的Array来获取名为arr,第3个值
                                                        Object elem=Array.get(arr, 3);
                                                        System.out.println(elem);
                                            
            

                                                    
            

标签: none

添加新评论