`
mmk12333
  • 浏览: 35105 次
  • 性别: 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 反射详解1

    javaSE 反射详解。

    JavaSE反射技术

    JavaSE反射技术是Java编程语言中的一个重要特性,它允许程序在运行时检查和操作类、接口、字段和方法等对象。这种动态类型的能力使得Java在处理未知类或接口时具有很大的灵活性,尤其在框架和库的开发中发挥着关键...

    JavaSE_JavaSE学习资料_

    除此之外,JavaSE还包含异常处理、多线程、反射、枚举、注解、包装类、日期时间API、正则表达式等诸多内容。异常处理能帮助我们编写健壮的代码,通过捕获和处理错误来避免程序意外终止。多线程则使得Java程序能够在...

    JavaSE项目最终总结

    JavaSE还包括反射机制,允许在运行时检查类的信息并动态创建对象,这在框架和插件系统中非常有用。 线程是Java并发编程的基础,Java提供了Thread类和Runnable接口来创建和管理线程。线程池和并发工具类(如...

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

    JavaSE常见面试题-高级反射-JVM篇 本文档涵盖了JavaSE中高级反射和JVM相关的知识点,包括Java中的反射机制、动态代理、设计模式、回收机制、JDK7和JDK8的区别、Jvm虚拟机原理等。 一、 Java中的反射机制 Java中的...

    JavaSE李学重讲义

    JavaSE还包含反射和动态代理等高级特性。反射允许我们在运行时检查类的信息,甚至修改其行为。动态代理则可以在运行时创建接口的实现类,常用于AOP(面向切面编程)。 最后,JavaSE的API非常丰富,如 Swing 和 AWT ...

    javaSEjavaSE

    JavaSE还包括了反射API,允许程序在运行时检查类的信息,如类名、方法、字段等,甚至动态调用方法或改变对象状态。泛型是JavaSE 5.0引入的新特性,增强了类型安全,减少了类型转换的麻烦。 总的来说,JavaSE是Java...

    JavaSE.zip

    除此之外,JavaSE还包含丰富的内置类库,如集合框架(ArrayList、LinkedList、HashMap、HashSet等)、I/O流(用于文件读写和网络通信)、线程处理(实现多任务并行执行)、反射API(在运行时动态访问类的信息)等。...

    JavaSE总结文档.rar

    2. **JavaSE基础知识总结之二**: - **集合框架**:ArrayList、LinkedList、HashSet、HashMap等容器的特性与使用场景,以及泛型的概念。 - **接口与内部类**:接口的定义与实现,静态与非静态内部类,匿名内部类的...

    javase阶段15个实战项目代码

    10. 注解与反射:通过使用注解和反射技术,可以实现元编程,增强代码的灵活性和可扩展性。 11. 序列化:学习如何序列化和反序列化对象,以便持久化数据或在网络间传输。 12. 泛型:泛型提供了类型安全,项目中可能...

    JavaSE将以

    JavaSE(Java Standard Edition)是Java开发平台的一个版本,主要用于桌面应用和服务器端开发。它提供了基础的Java编程环境,包括核心类库、JVM(Java虚拟机)以及开发工具。在JavaSE中,开发者可以学习到如何创建、...

    javase笔记.7z

    JavaSE,全称为Java Standard Edition,是Java平台的标准版,主要面向桌面应用和服务器端开发。这个压缩包“javase笔记.7z”显然包含了关于JavaSE的学习笔记,可能包括了核心概念、语法、API使用等内容。下面我们将...

    Javase 技术代码测试

    通过`@interface`定义注解,使用反射API获取注解信息,可以用于代码的验证、配置、性能监控等多种用途。 这个项目旨在通过实践来检验和巩固以上各个JavaSE技术点的理解和应用能力。开发者可以通过阅读和运行代码,...

    JavaSE课件JavaSE课件

    JavaSE,全称为Java Standard Edition,是Java平台的标准版,主要面向桌面应用和服务器端开发。它是学习Java编程的基础,提供了构建其他Java平台(如JavaEE和JavaME)的基石。本课件“JavaSE课件JavaSE课件”旨在为...

    JavaSE25套习题(含答案)

    8. **反射**:反射允许程序在运行时检查类的信息,创建和调用对象,是实现动态代理、元数据处理等功能的基础。 9. **枚举与注解**:枚举提供了一种安全的方式来表示有限的常量集合,注解则是元数据的一种形式,可以...

    0-JavaSE课程介绍

    - 反射机制和设计模式的扩展知识。 #### 三、总结 JavaSE作为Java技术体系中的核心部分,不仅提供了学习JavaEE的基础,也为后续深入到其他领域(如Android应用开发)打下了坚实的技术根基。通过本课程的学习,...

    JavaSE基础课件

    此外,JavaSE还包括反射、注解、枚举、泛型等特性。反射允许程序在运行时动态获取类的信息并操作对象,注解可以用于元数据,提供编译时和运行时的元信息,枚举类型增强了常量的定义,泛型则提供了类型安全的容器,...

    JavaSE常用知识代码实现

    7. **反射**:Java反射机制允许在运行时检查类的信息,动态创建对象和调用方法,是实现元编程的重要工具。 8. **泛型**:泛型增强了类型安全,允许在编译时检查类型,减少强制类型转换。 9. **枚举**:Java的枚举...

Global site tag (gtag.js) - Google Analytics