【Java SE】反射

简介: 【Java SE】反射


好久之前,学过的反射

对反射有点一知半解,今天详细整理了一下

1. 获取Class的对象的方式

  • Class.forName(“全类名”):将字节码文件加载进内存,返回class对象
    多用于配置文件,将类名定义在配置文件中,读取文件,加载类
  • 类名.class :通过类名的属性class获取
    多用于参数的传递
  • 对象.getclass(): getclass()方法任object类中定义看
    多用于对象的获取字节码的方式
  • 结论:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获得的Class对象都是一样的

2. Class对象的功能

2.1 获取功能

  1. 获取成员变量
  • Field[] getFields() : 获取所有的公有变量
  • Field getField(string name):获取指定名称的公有变量
  • Field[] getDeclaredFields():获取所有的成员变量
  • Field getDeclaredField(string name):获取指定名称的变量
Class testClass = Test.class; // 获取类对象
    Field field = testClass.getDeclaredField("name"); // 获取变量
    field.setAccessible(true); // 解除私有
    Test test = new Test();
    Object string = field.get(test); // 获取私有的值
    System.out.println("我是原来的:" + string);
    field.set(test, "lr"); // 修改私有的值
    Object string1 = field.get(test);
    System.out.println("我是后来的:" + string1);
  1. 获取构造方法
  • constructorgetconstructors()
  • Constructorgetconstructor(类…parameterTypes)
  • Constructor getDeclaredConstructor(类… parameterTypes)
  • constructorgetDeclaredconstructors()
Class testClass = Test.class; // 获取类对象
    Constructor constructor = testClass.getConstructor(String.class); // 获取构造方法
    Object test = constructor.newInstance("张三"); // 实例化赋予初值
    System.out.println(test);
  1. 获取成员方法
  • Method[]getMethods()
  • Method getHethod(string name,类… parameterTypes)
  • Method[l getDeclaredMethods()
  • Method getDeclaredMethod(string name,类… parameterTypes)
Class testClass = Test.class; // 获取类对象
    Test test = new Test(); 
    Method method = testClass.getMethod("test", int.class); // 放入实例化和参数
    method.invoke(test, 1); // 运行该方法
  1. 获取类名
  • String.getName()
  1. Field:成员变量
  • 设置值
    set()
  • 获取值
    get()
  • 忽略访问权限修饰符
    setAccessible(true)
  1. Constructor:构造方法
  • 创建对象
  • newInstance(Object… initargs)
  1. Method:方法对象
  • 执行方法
  • Object invoke(Object obj, Object… args)
  • 获取方法名
  • String getName:获取方法名

3. 案例

  • 需求:写一个框架,不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意的方法
  • 实现
  1. 配置文件
  2. 反射
  • 步骤
  1. 将需要创建的对象的全类名和需要执行的方法定义在配置文件中
  2. 在程序中加载读取配置文件
  3. 使用反射技术来加载类文件进内存
  4. 创建方法
  5. 执行方法

Reflect.Class

package fanshe;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
public class Reflect {
  public static void main(String[] args) throws Exception {
    // 创建对象
    Properties properties = new Properties();
    // 获取类的加载器,可以找到src下的文件
    ClassLoader classLoader = Reflect.class.getClassLoader();
    // 读入文件
    InputStream stream = classLoader.getResourceAsStream("pro.properties");
    // 传入字节流
    properties.load(stream);
    // 获取配置文件中数据
    String className = properties.getProperty("className");
    String methodName = properties.getProperty("methodName");
    // 加载该类进内存
    Class cls = Class.forName(className);
    // 创建对象、实例化
    Object obj = cls.newInstance();
    Method method = cls.getDeclaredMethod(methodName);
    method.invoke(obj);
  }
}

pro.properties

className=fanshe.Person
methodName=sleep


相关文章
|
28天前
|
监控 Java
Java基础——反射
本文介绍了Java反射机制的基本概念和使用方法,包括`Class`类的使用、动态加载类、获取方法和成员变量信息、方法反射操作、以及通过反射了解集合泛型的本质。同时,文章还探讨了动态代理的概念及其应用,通过实例展示了如何利用动态代理实现面向切面编程(AOP),例如为方法执行添加性能监控。
|
1月前
|
Java
Java的反射
Java的反射。
29 2
|
2月前
|
存储 Java
[Java]反射
本文详细介绍了Java反射机制的基本概念、使用方法及其注意事项。首先解释了反射的定义和类加载过程,接着通过具体示例展示了如何使用反射获取和操作类的构造方法、方法和变量。文章还讨论了反射在类加载、内部类、父类成员访问等方面的特殊行为,并提供了通过反射跳过泛型检查的示例。最后,简要介绍了字面量和符号引用的概念。全文旨在帮助读者深入理解反射机制及其应用场景。
37 0
[Java]反射
|
3月前
|
安全 Java 索引
Java——反射&枚举
本文介绍了Java反射机制及其应用,包括获取Class对象、构造方法、成员变量和成员方法。反射允许在运行时动态操作类和对象,例如创建对象、调用方法和访问字段。文章详细解释了不同方法的使用方式及其注意事项,并展示了如何通过反射获取类的各种信息。此外,还介绍了枚举类型的特点和使用方法,包括枚举的构造方法及其在反射中的特殊处理。
75 9
Java——反射&枚举
|
2月前
|
安全 Java 测试技术
🌟Java零基础-反射:从入门到精通
【10月更文挑战第4天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
30 2
|
3月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
2月前
|
IDE Java 编译器
java的反射与注解
java的反射与注解
21 0
|
3月前
|
Oracle Java 关系型数据库
Java(TM) Platform SE binary 已停止工作”的解决方法
Java(TM) Platform SE binary 已停止工作”的解决方法
269 2
|
3月前
|
Java 程序员 编译器
Java的反射技术reflect
Java的反射技术允许程序在运行时动态加载和操作类,基于字节码文件构建中间语言代码,进而生成机器码在JVM上执行,实现了“一次编译,到处运行”。此技术虽需更多运行时间,但广泛应用于Spring框架的持续集成、动态配置及三大特性(IOC、DI、AOP)中,支持企业级应用的迭代升级和灵活配置管理,适用于集群部署与数据同步场景。
|
3月前
|
存储 安全 Java
扫盲java基础-反射(一)
扫盲java基础-反射(一)