23.反射(reflection)|Java学习笔记

文章目录

  • 反射机制
    • Java反射机制原理图
    • Java反射机制可以完成
    • 反射相关的主要类
    • 反射优点和缺点
  • Class类

反射机制

23.反射(reflection)|Java学习笔记_第1张图片

一个简单的例子:

package com.edu.reflection.question;

import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

public class ReflectionQuestion {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        // 根据配置文件 re.properties 指定信息,创建Cat对象并调用方法hi
        // 1.使用Properties 类,读取配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream("D:\\study_folder\\学习笔记\\Java\\韩顺平java\\代码\\chapter23\\src\\re.properties"));
        String classfullpath = properties.get("classfullpath").toString();
        String methodName = properties.get("method").toString();
        System.out.println("classfullpath= " + classfullpath);
        System.out.println("method= " + methodName);
        // 2.创建对象 , 传统的方法,行不通 =》 反射机制

        // 3.使用反射机制解决
        //(1)加载类,返回Class类型的对象cls    (这个类就叫Class,cls是Class类型的一个对象)
        Class<?> cls = Class.forName(classfullpath);
        // (2)通过 cls 可以得到加载的类 com.edu.Cat
        Object o = cls.newInstance();       // @Deprecated(since = "9")
        System.out.println("o的运行类型 = " + o.getClass());   // 得到运行类型
        // (3)通过getMethod 得到加载的类 com.edu.Cat 的 methodName "hi" 的方法对象
        // 即:在反射中,可以把方法视为对象(万物皆对象)
        Method method1 = cls.getMethod(methodName);
        // (4)通过method1调用方法,即通过方法对象来实现调用方法
        System.out.println("=================================");
        method1.invoke(o);  // 反射机制: 方法.invoke(对象);
    }
}

控制台输出结果如下:
classfullpath= com.edu.Cat
method= hi
o的运行类型 = class com.edu.Cat
=================================
hi 招财猫

23.反射(reflection)|Java学习笔记_第2张图片

Java反射机制原理图

23.反射(reflection)|Java学习笔记_第3张图片
Java反射机制-十分钟搞懂

Java反射机制可以完成

  1. 在运行时判断任意一个对象所属的类。
  2. 在运行时构造任意一个类的对象。
  3. 在运行时得到任意一个类所具有的成员变量和方法。
  4. 在运行时调用任意一个对象的成员变量和方法。
  5. 生成动态代理。

反射相关的主要类

  1. java.lang.Class:代表一个类, Class对象表示某 个类加载后在堆中的对象
  2. java.lang.reflect.Method:代表类的方法,Method对象表示某个类的方法
  3. java.lang.reflect.Field:代表类的成员变量,Field对象表示某个类的成员变量
  4. java.lang.reflect.Constructor:代表类的构造方法,Constructor对象表示构造器

这些类在java.lang.reflection

// 这里的 cls 就是上面示例中的 Class cls = Class.forName(classfullpath);

Method method1 = cls.getMethod(methodName);
// (4)通过method1调用方法,即通过方法对象来实现调用方法
System.out.println("=================================");
method1.invoke(o);  // 反射机制: 方法.invoke(对象);

// java.lang.reflect.Field:**代表类的成员变量,Field对象表示某个类的成员变量**
Field NameField = cls.getField("name");     // getField 不能得到私有的属性(受制于访问修饰符)
System.out.println(NameField.get(o));       // 输出了 "招财猫"        反射:成员变量对象.get(对象)

//  java.lang.reflect.Constructor:代表类的构造方法,**Constructor对象表示构造器**
Constructor<?> constructor = cls.getConstructor();  // ()中可以指定构造器参数类型,返回无参构造器
System.out.println(constructor);

Constructor<?> constructor1 = cls.getConstructor(String.class); // 传入的String.class就是String类的Class对象
System.out.println(constructor1);

反射优点和缺点

  1. 优点:可以动态的创建和使用对象(也是框架底层核心),使用灵活,没有反射机制,框架技术就失去底层支撑。
  2. 缺点:使用反射基本是解释执行,对执行速度有影响。

Class类

你可能感兴趣的:(Java,java,反射)