`
mmk12333
  • 浏览: 33596 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

javaSE之反射

阅读更多

什么是反射?

  简单的说:剖析java类中的各个组成部分,映射成一个个java对象。

在java.lang.reflect中。

 

反射用在哪?

  多用于框架和组件,利用反射技术写出复用性高的通用程序

 

我只列出了反射中几个常用的API

    类 Class

    构造方法 Constructor

    成员变量 Field

    方法  Method

 

1.class     字节码文件

    可以获得这个类的所有的特性

 如何得到某个class类文件对应的class对象?

     .已知类和对象的情况下:

         类名.class

         对象.getClass();

     .未知类和对象的情况下:

        Class.forName("包名.类名");

              forName用于加载类字节码到内存中,并封装成一个Class对象

 例:

     // 获得一个.class 字节码文件 对应Class类对象
    @Test
    public void demo1() throws ClassNotFoundException {
        // 已知类情况下 获得字节码对象
        Class c1 = ClassTest.class;

        // 已知一个对象,但是不知道这个对象属于哪个类,获得字节码对象
        Object o = new ArrayList();
        Class c2 = o.getClass(); // 等价于 ArrayList.class

        // 未知类和对象情况下
        String classDescription = "action.ClassTest";
        Class c3 = Class.forName(classDescription);
    }

 

 

2.Constructor

   constructor类的实例对象代表类的一个构造方法

        .得到某个类所有的构造方法

         Constructor[] constructor = Class.forName("java.lang.String").getConstructor();

 

        .得到制定的构造方法并调用

         Constructor constructor =  Class.forName("java.lang.String").getConstructor(String.class);

                String str = (String)constructor.newInstance("abc");

 

        Class类的newInstance()方法用来调用类的默认构造方法

                String obj = (String)Class.forName("java.lang.String").newInstance();

// 调用指定构造方法
    @Test
    public void demo3() throws ClassNotFoundException, SecurityException,
            NoSuchMethodException, IllegalArgumentException,
            InstantiationException, IllegalAccessException,
            InvocationTargetException {
        // 已知类情况下,通过new 创建实例
        ClassTest classTest = new ClassTest(10);

        // 1. 获得字节码对象
        Class c = Class.forName("action.ClassTest");

        // 2. 获得指定构造方法
        Constructor constructor = c.getConstructor(int.class);

        // 3、调用构造方法 获得对象
        Object o = constructor.newInstance(10);
    }

 

3.Field

    Field类代表某个类中的一个成员变量,并提供动态的访问权限

    Field对象的获取:

         .得到所有的成员变量

                  Field[] field = c.getField();// 取得所有Public属性

                  Field[] field = c.getDeclaredFields(); //取得所有声明的属性(包括私有)

 

         .得到指定的成员变量

                  Field name =c.getField("name");

                  Field name =c.getDeclaredField("name");//私有

 

         .设置Field变量是否可以访问

                  field.setAccessible(boolean);

 

         .Field变量值的读取设置

                  field.get(obj);

                  field.set(obj,value);

 

   例:

          @Test
    public void demo1() throws ClassNotFoundException, SecurityException,
            NoSuchFieldException, InstantiationException,
            IllegalAccessException {
        // 以前方法操作变量
        FieldMethodTest fieldMethodTest = new FieldMethodTest();
        fieldMethodTest.num = 10;

        // 1、获得字节码文件
        Class c = Class.forName("cn.itcast.reflect.FieldMethodTest");
        // 2、获得num成员变量 对应反射对象 Field
        Field[] fields = c.getFields(); // 获得所有public属性
        System.out.println(fields.length);

        Field[] fields2 = c.getDeclaredFields();
        System.out.println(fields2.length);

        Field field = c.getDeclaredField("num");
        // 3. 为num 赋值
        Object o = c.newInstance(); // 调用默认构造方法
        // 修改私有变量是 可见的
        field.setAccessible(true);
        field.set(o, 20);
        System.out.println(field.get(o));
    }

 

 

4. Method:

    Method 和Field基本雷同 这里贴出例子

         @Test
    public void demo2() throws ClassNotFoundException, InstantiationException,
            IllegalAccessException, SecurityException, NoSuchMethodException,
            IllegalArgumentException, InvocationTargetException {
        // 以前方式
        FieldMethodTest fieldMethodTest = new FieldMethodTest();
        fieldMethodTest.m("001");

        // 1. 获得Class对象
        Class c = Class.forName("action.FieldMethodTest");
        // 2、获得对象
        Object o = c.newInstance();
        // 3. 获得m对象反射中Method对象
        Method m = c.getMethod("m", String.class);
        // 4. 调用o对象m方法
        m.invoke(o, "008");
    }

 

0
0
分享到:
评论

相关推荐

    JavaSE 高级反射-JVM篇.xmind

    JavaSE 高级反射-JVM篇

    JavaSE反射详解.ppt

    JavaSE反射详解

    JavaSE常见面试题-高级反射-JVM篇.pdf

    JavaSE常见面试题-高级反射-JVM篇

    JavaSE反射技术

    资源内还有JavaSE反射技术详解的代码实现。详情参见我的博客:http://blog.csdn.net/zhongkelee/article/details/48834343

    javaSE笔记

    JavaSE学习笔记,多线程,I/O流,集合,反射,常用设计模式

    13反射.xmind-JavaSE进阶学习图

    JavaSE进阶学习图

    Reflection反射.md

    javase基础之反射

    JavaSE 五万字总结.pdf

    JavaSE总结 Java基础语法 类型转换 运算符 流程控制 循环 Random 数组 方法 方法重载 递归 二进制 类和对象 成员变量局和部变量 封装 构造方法 String 集合 继承 GIT 抽象类 多态 Java8 异常 泛型 Map File IO 多...

    JavaSE最全教程

    最全的javaSE 教程,包含Java语言基础、流程控制、函数、数组、对象、修饰符、接口、内部类、集合、异常处理、多线程、IO框架、反射、OOAO初步等基础知识点汇总

    JavaSE进阶-08-反射机制1

    1.1 反射的基本概念 1.2 Java 中的类反射 2.2.1 2.2.2

    MLDN魔乐所有javaSE的pdf文档

    MLDN魔乐所有javaSE的pdf文档,文档编号是从5开始的,因为前面讲的是Oracle的东西没有上传。 文件目录: 5.Java基础.pdf 6.面向对象基础(1).pdf 7.面向对象基础(2).pdf 8.面向对象基础(3).pdf 9.面向对象高级(1).pdf...

    javaSE讲义.rar

    1.环境构建 2.Java基础 标识符->数据类型->运算符->控制语句 3.面向对象 4.数组 5.常用类 6.异常处理 7.集合 8.流 9.数据库 10.GUI编程 11.JDBC 12.多线程 ...14.反射 15.设计模式

    JavaSE jar包

    个人封装的Javase阶段相关的jar包,包含集合,反射,线程,IO,网络编程,jdbc等工具类 对于学习se新人,应该还是很有用处的,对于高手的话,请出门左转绕过。

    【大厂面试题总结】JavaSE面试题合集及其答案,基本包括javaSE所有知识点和详细解释

    深入理解Java的反射机制 深入理解Java异常体系 谈谈NIO的理解 谈一谈对JUC的理解 ArrayList的底层原理 HashMap的底层原理 iava单例模式详解 JAVA的内存结构 java队列 Java基础思考之数据传递 JAVA内存泄漏详解 java...

    JavaSE.xmind

    Java基础语法,面向对象,API, 集合,IO流,泛型,异常,线程,枚举,网络编程,反射,注解,新特性

    JavaSE异常与多线程

    入门级笔记,适合查漏补缺。

    javaSE代码实例

    17.1.2 JavaSE 5.0中固定尺寸线程池的基本知识 374 17.1.3 自定义尺寸固定线程池的使用 375 17.1.4 单任务线程池的使用 377 17.1.5 可变尺寸线程池的使用 378 17.1.6 延迟线程池的使用 380 17.1.7 使用...

    14、JavaSE:注解和反射.pdf

    看B站视频项目总结的系列文档,仅供个人学习使用

    JAVASE.xmind

    Java知识点思维导图。基础java知识点,没写网络编程和反射。

    JavaSE学生信息管理系统

    本系统实现了学生信息的增删改查功能,主要借助JTable来进行实现,并结合了简单工厂模式和反射。

Global site tag (gtag.js) - Google Analytics