当前位置:   article > 正文

小白入门java基础-反射详解

小白入门java基础-反射详解

一:介绍

Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高级程序设计语言。

Java 可运行于多个平台,如 Windows, Mac OS 及其他多种 UNIX 版本的系统。Java语言编写的程序,在一次编译后,可以在多个系统平台上运行。

主要特性:

  • Java 语言是简单的:
  • Java 语言的语法与 C 语言和 C++ 语言很接近,使得大多数程序员很容易学习和使用。另一方面,Java 丢弃了 C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java 语言不使用指针,而是引用。并提供了自动分配和回收内存空间,使得程序员不必为内存管理而担忧。
  • Java 语言是面向对象的:
  • Java 语言提供类、接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为 implements)。Java 语言全面支持动态绑定,而 C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。
  • Java语言是分布式的:
  • Java 语言支持 Internet 应用的开发,在基本的 Java 应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括 URL、URLConnection、Socket、ServerSocket 等。Java 的 RMI(远程方法激活)机制也是开发分布式应用的重要手段。
  • Java 语言是健壮的:
  • Java 的强类型机制、异常处理、垃圾的自动收集等是 Java 程序健壮性的重要保证。对指针的丢弃是 Java 的明智选择。Java 的安全检查机制使得 Java 更具健壮性。
  • Java语言是安全的:
  • Java通常被用在网络环境中,为此,Java 提供了一个安全机制以防恶意代码的攻击。除了Java 语言具有的许多安全特性以外,Java 对通过网络下载的类具有一个安全防范机制(类 ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类 SecurityManager)让 Java 应用设置安全哨兵。
  • Java 语言是体系结构中立的:
  • Java 程序(后缀为 java 的文件)在 Java 平台上被编译为体系结构中立的字节码格式(后缀为 class 的文件),然后可以在实现这个 Java 平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。

二:反射

1、什么是反射?

        反射是 java 中重要的一个只是模块,其是框架设计的灵魂,基本上所有的框架都是使用反射机制来实现的。

将类的各个组成部分封装为其他对象,这就是反射机制。

2、反射的优点

  • 可以在程序运行过程中,操作这些对象
  • 可以解耦,提高程序的可扩展性

3、获取Class对象的方式

  • Class.forName("全类名"):将字节码文件加载进内存,返回 Class 对象(多用于配置文件)
  • 类名.class:通过类名的属性 class 获取(多用于传参的构造)
  • 对象.getClass():该方法定义于Object中(多用于对象的获取字节码方式)

注意:同一个字节码文件,在以上三种方式中,获取的 class 对象都是同一个。

  1. package cn.reflectTest;
  2. public class reflectTest {
  3. public static void main(String[] args) throws Exception {
  4. // 1.通过class.forName获取
  5. Class cls1 = Class.forName("cn.reflectTest.reflectClass");
  6. // 2.直接用类名.clss获取
  7. Class cls2 = reflectClass.class;
  8. // 3.使用对象获取
  9. reflectClass obj = new reflectClass();
  10. Class cls3 = obj.getClass();
  11. }
  12. }

 4、Class 对象功能:

  1. 获取成员变量们:
    1. getFields():获取所有使用publi修饰的成员变量,返回 Field[]
    2. getField(String name):获取使用public修饰的指定成员变量,返回 Field
    3. getDeclaredFields():获取所有的成员变量,返回 Field[]
    4. getDeclaredField(String name):获取指定成员变量。返回 Field
  2. 获取构造方法们:
    1. getConstructors():返回 Construct<?>[]
    2. getConstruct(类<?>...parameterTypes):返回 Construct<T>
    3. getDeclaredConstructs():返回 Construct<?>[]
    4. getDeclaredConstruct(类<?>...parameterTypes):返回 Construct<T>
  3. 获取成员方法们:
    1. getMethods():获取所有使用publi修饰的成员方法,返回 Method[]
    2. getMethod(String name,类<?>...parameterTypes):获取使用public修饰的指定成员方法,返回 Method
    3. getDeclaredMethods():获取所有的成员方法,返回 Method[]
    4. getDeclaredMethod(String name,类<?>...parameterTypes):获取指定成员方法。返回 Method
  4. 获取类名:
    1. getName():返回 String

        备注:暴力反射:setAccessible() 忽略访问权限符的安全检查

5、案例

        要求:写一个框架,可以创建任意类的对象,并且执行其中的任意方法

        1)目录如下

        2)配置文件 pro.properties 中代码如下

  1. className=
  2. methodName=

        3)Person 和 Student 代码如下

  1. package cn.cats.doMain;
  2. public class Person {
  3. public void eat(){
  4. System.out.println("eat...");
  5. }
  6. }
  7. package cn.cats.doMain;
  8. public class Student {
  9. public void sleep(){
  10. System.out.println("sleep...");
  11. }
  12. }

        4)框架类 ReflectTest 代码如下

  1. package cn.cats.doMain;
  2. import java.io.InputStream;
  3. import java.lang.reflect.Method;
  4. import java.util.Properties;
  5. /**
  6. * 框架类
  7. */
  8. public class ReflectTest {
  9. public static void main(String[] args) throws Exception {
  10. // 创建任意类对象,执行任意方法
  11. // 1.加载配置文件
  12. // 1.1创建pro对象
  13. Properties pro = new Properties();
  14. // 1.2加载配置文件,转换为一个集合
  15. // 1.2.1获取class目录下的配置文件
  16. ClassLoader classLoader = ReflectTest.class.getClassLoader();
  17. InputStream is = classLoader.getResourceAsStream("pro.properties");
  18. System.out.println(classLoader);
  19. pro.load(is);
  20. // 2.获取配置文件中定义的数据
  21. String className = pro.getProperty("c1assName");
  22. String methodName = pro.getProperty ( "methodName" );
  23. // 3.加载该类进内存
  24. Class cls = Class.forName(className) ;
  25. //4.创建对象
  26. Object obj = cls.newInstance();
  27. //5.获取方法对象
  28. Method method = cls.getMethod (methodName) ;
  29. //6.执行方法
  30. method.invoke(obj);
  31. }
  32. }

三:结尾

        通过反射的学习,虽然在实际开发中使用较少,但是当需要自己写一些框架的时候,这是必须要用到的知识。因此反射是 java 中非常重要的一部分,好啦本文就到此为止啦,希望能够对各位小伙伴有所帮助哦。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/918649
推荐阅读
相关标签
  

闽ICP备14008679号