文章目录
- 反射机制
 - Java反射机制原理图
 - Java反射机制可以完成
 - 反射相关的主要类
 - 反射优点和缺点
 
- Class类
 
反射机制

一个简单的例子:
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 招财猫
 

Java反射机制原理图

 Java反射机制-十分钟搞懂
Java反射机制可以完成
- 在运行时判断任意一个对象所属的类。
 - 在运行时构造任意一个类的对象。
 - 在运行时得到任意一个类所具有的成员变量和方法。
 - 在运行时调用任意一个对象的成员变量和方法。
 - 生成动态代理。
 
反射相关的主要类
- java.lang.Class:代表一个类, Class对象表示某 个类加载后在堆中的对象
 - java.lang.reflect.Method:代表类的方法,Method对象表示某个类的方法
 - java.lang.reflect.Field:代表类的成员变量,Field对象表示某个类的成员变量
 - 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);
 
反射优点和缺点
- 优点:可以动态的创建和使用对象(也是框架底层核心),使用灵活,没有反射机制,框架技术就失去底层支撑。
 - 缺点:使用反射基本是解释执行,对执行速度有影响。
 



















