JAVA反射机制

 

  java 中的反射:

                 反射:

            在程序的运行状态中,对任意一个类 都能够获取它的属性 和方法;        

                 对于任意一个对象,都能调用它的属性 方法;动态获取信息的方式,以及动态获取方法的功能称为Java的反射机制;

 

           如何动态获取:

                 将Java源文件(.java) 编译成 字节码文件(.class), 然后在 获取对应的 类中方法属性;

        正常:源文件编译过程:

 

 

  • 通过反射 获取 当前对象 所对应的类:

       1.  对象.getclass

       2.  .class

       3 . 通过 类对应的路径 获取 Class.forName("com.yc123.demo.Base");

         

        常用的一些 方法:

              "获取类名:"+clazz.getSimpleName()

                   "获取全名:"+clazz.getName()

                   "获取访问修饰符:"+Modifier.toString(clazz.getModifiers())

                   "获取类所在的包路径:"+clazz.getPackage().getName()

 

 

  • 通过反射 获取对象 所表示类 中的方法

       Class teaCalss =对象.getClass();

       1 .获取 公共的方法

                                Method[] methods = teaCalss.getMethods();

       2 .获取 所有的方法

                                methods = teaCalss.getDeclaredMethods();

        常用方法:

                "访问修饰符号:"+Modifier.toString(clazz.getModifiers())

                                          "方法名称:"+method.getName());

                                          "方法返回值类型:"+method.getReturnType().getSimpleName());

                                          "方法参数类型 列表:"+Arrays.asList(method.getParameterTypes());

 

       通过反射的反射调用方法:

       Method method = teaCalss.getDeclaredMethod("salary");

                            //开启 私有方法的调用

                            method.setAccessible(true);

                            //通过反射的反射 调用 该方法

                            method.invoke(tea);

 

 

  • 通过反射获取对象 所表示类 所有接口/方法中的 指定的字段:

       1 .获取 所有的字段

                Field[] fiels = clazz.getDeclaredFields();

                      for (Field field : fiels) {

                            try {

                                     System.out.println(field.get(对象));

                            } catch (IllegalArgumentException e) {

                                     e.printStackTrace();

                            } catch (IllegalAccessException e) {

                                      e.printStackTrace();

                            }

                     }

     2 .获取 子类,接口,父类的公共字段

                Field[] fiels = clazz.getFields();

 

     常用方法:

                "访问修饰符号:"+Modifier.toString(field .getModifiers())

                                          "字段名称:"+field .getName());

                                          "字段类型:"+field .getType());

                                          "字段内容:"field .get(对象名);

 

                                         

  • 通过反射类型实例化一个对象:

              Eg

          Object stu  = (强制转换类型) teaCalss.newInstance();

 

 

   五.类加载器 :通过url类加载文件操作:

 

         URL url = clazz.getClassLoader().getResource("text.docx");

        //将文件 转换 为文件流操作

                   InputStream in = clazz.getClassLoader().getResourceAsStream("text.docx");

                   try {

                            //读取 缓冲区中的内容

                            byte[] buffer =       new byte[in.available()];

                            //向指定长度 缓冲区中 读入数据

                            in.read(buffer);

                           

                            System.out.println("new String(buffer)===>"+new String(buffer));

                           

                            //关闭流操作

                            in.close();

                   } catch (IOException e) {

                            e.printStackTrace();

                   }

                  

         }

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值