文章目录
- 反射机制
- 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);
反射优点和缺点
- 优点:可以动态的创建和使用对象(也是框架底层核心),使用灵活,没有反射机制,框架技术就失去底层支撑。
- 缺点:使用反射基本是解释执行,对执行速度有影响。