反射

举报
京与旧铺 发表于 2022/06/29 16:41:53 2022/06/29
【摘要】 反射反射机制1、反射机制有什么用? 通过java语言中的反射机制可以操作字节码文件。 可以读和修改字节码文件。 通过反射机制可以操作代码片段。(class文件)2、反射机制的相关类在哪个包下? java.lang.reflect.*;3、反射机制相关的重要的类有哪些? java.lang.Class:代表整个字节码,代表一个类型。java.lang.reflect.Method:代...

反射

反射机制

1、反射机制有什么用? 通过java语言中的反射机制可以操作字节码文件。 可以读和修改字节码文件。 通过反射机制可以操作代码片段。(class文件)

2、反射机制的相关类在哪个包下? java.lang.reflect.*;

3、反射机制相关的重要的类有哪些? java.lang.Class:代表整个字节码,代表一个类型。

java.lang.reflect.Method:代表字节码中的方法字节码。
​
java.lang.reflect.Constructor:代表字节码中的构造方法字节码。
​
java.lang.reflect.Field:代表字节码中的属性字节码。

4、要操作一个类的字节码,首先需要获取到这个类的字节码,怎么获取java.lang.Class实例? 三种方式: 第一种:Class c = Class.forName("完整类名带包名");

    第二种:Class c = 对象.getClass();
​
    第三种:Class c = 任何类型.class;
​
            Class s = String.class; // s代表String类型
            Class d = Date.class; //k代表Date类型
            Class i = int.class;  //i代表int类型

5、用反射机制创建Java对象 Class c = Class.forName("完整类名"); Object obj = c.newInstance();

还可以结合配置文件使用,forName()括号里面可以填写key,通过key来获取value,此时这个key
就相当于完整的类名。(如果要一次创建多个对象,可以创建数组)


优点:java代码每写一遍,在不改变java源代码的基础上,可以做到不同对象的实例化。
      
      符合OCP开闭原则:对扩展开放,对修改关闭。(程序更加的灵活)

6、Class.forName()这个方法会导致:类加载。 而类加载时静态代码块就会执行。 所以,如果只想执行静态代码块中的代码,可以直接写成: Class.forName("完整类名");

7、以下代码可以拿到一个文件的绝对路径 String path = Thread.currentThread().getContextClassLoader().getResource("文件名").getPath();

代码解释:
    Thread.currentThread();  当前线程对象
    getContextClassLoader(); 是线程对象的方法,可以获取到当前线程的类加载器对象
    getResource();  【加载资源】这是类加载器对象的方法,当前线程的类加载器默认从类的根路径下加载资源
    getPath();  获取路径
​
注意:文件必须要在类文件下面,即src下面。

8、直接以流的形式返回 InputStream reader = Thread.currentThread().getContextClassLoader().getResourceAsStream("文件名");

9、java.util包下提供了一个资源绑定器,便于获取属性配置文件中的内容。 使用以下这种方式的时候,属性配置文件xxx.properties必须放到类路径下。

//资源绑定器,只能绑定xxx.properties文件。并且这个文件必须放到类路径下。文件扩展名也必须是properties
//并且在写路径的时候,路径后面的扩展名不能写。
​
ResourceBundle bundle = ResourceBundle.getBundle("文件名");
String className = bundle.getString(key:" ");
System.out.pritnln(classNmae);
​
(以后就使用以上方法就行。)

10、关于JDK中自带的类加载器: 10.1、什么是类加载器? 专门负责加载类的命令/工具。 ClassLoader

10.2、JDK中自带了3个类加载器
    启动类加载器:rt.jar
    扩展类加载器:ext/*.jar
    应用类加载器:classpath --->应用类即自己写的类
​
10.3、假设有这样一段代码:
    String s = "abc";
​
    代码在开始执行之前,会将所需要的类全部加载到JVM当中。
    通过类加载器加载,看到以上代码,类加载器会找string.class
    文件,找到就加载,那是怎么加载的呢?
​
        首先通过“启动类加载器”加载。
            注意:启动类加载器专门加载:rt.jar文件
            rt.jar中都是JDK最核心的类库。
​
        如果通过“启动类加载器”加载不到的时候,
        会通过“扩展类加载器”加载。
            注意:扩展类加载器专门加载ext/*.jar
​
        如果“扩展类加载器”没有加载到,那么
        会通过“应用类加载器”加载。
            注意:应用类加载器专门加载:classpath中的类。
​
10.4、java中为了保证类加载的安全,使用了双亲委派机制。
    优先从启动类加载中加载,这个称为“父”,
    “父”无法加载到,再从扩展类加载,这个称为“母”。
    双亲委派,如果都加载不到,才会考虑从应用类加载器中
    加载。直到加载到位置。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。