Java反射机制

痛定思痛。 2022-02-01 03:49 180阅读 0赞

Java反射机制

  • 什么是反射?
  • 反射机制能做什么?
  • 获取字节码对象的三种方式
  • 简单实用例子
    • 创建对象实例
    • 获取构造器创建对象实例
    • 获得成员变量
    • 获取对象中的方法
  • 反射的实际使用场景

什么是反射?

  • 反射机制是在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制。
  • 想要使用反射机制就必须获得该类的字节码对象(.class)。

反射机制能做什么?

  • 在运行时判断一个对象所属的类
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时构造任意一个类的对象
  • 在运行时调用任意一个对象的方法
  • 生成动态代理

获取字节码对象的三种方式

  1. 通过实例对象的getClass()方法获取

    Persion p = new Persion();
    Class class = p.getClass();
    ….

  2. 通过类的静态属性获取

    Class class = Persion.class;

  3. 通过全限定名直接获取到一个类的字节码文件对象,此时还是源文件阶段,还没有变成字节码文件。

    Class class = Class.forName(“com.demo.Persion”);

开发中最常用的是方式3,它只需要提供全限定名即可创建对象,通常可以配置在配置文件中,更加方便扩展性强。

简单实用例子

创建对象实例

  1. public class Persion{
  2. String name;
  3. //省略get/set
  4. }
  5. @Test
  6. public void test(){
  7. Class class = Class.forName("com.demo.Persion");
  8. Object obj = class.newInstance();
  9. }

获取构造器创建对象实例

  1. public class Persion{
  2. String name;
  3. //省略get/set
  4. public Persion(String name) {
  5. this.name = name;
  6. }
  7. }
  8. @Test
  9. public void test(){
  10. Class class = Class.forName("com.demo.Persion");
  11. Constructor constructor = class.getConstructor(String.class);
  12. Persion persion = (Persion)constructor.newInstance("tom");
  13. //获取所有构造方法
  14. Constructor[] constructor = persion.getConstructors();
  15. for (Constructor cons : constructor) {
  16. //获得构造函数中的所有参数类型的字节码对象
  17. Class[] parameterTypes = cons.getParameterTypes();
  18. }
  19. }

获得成员变量

  1. public class Persion{
  2. String name;
  3. public String addr;
  4. //省略get/set
  5. }
  6. @Test
  7. public void test(){
  8. Class persion = Class.forName("com.demo.Persion");
  9. Object obj = persion.newInstance();
  10. //获得指定成员变量,如果是public修饰的可以使用getFile()获取
  11. Field file = persion.getDeclareField("name");
  12. //如果是私有属性,需要打开可见权限
  13. file.setAccessible(true);
  14. //设置指定对象的成员变量值
  15. file.set(obj,"tom");
  16. //获得所有成员变量
  17. Filed[] fileds = persion.getDeclareFields();
  18. for(Filed res : fileds) {
  19. res.setAccessible(true);
  20. }
  21. }

获取对象中的方法

  1. public class Persion{
  2. //省略属性和get/set
  3. public void print(String message){
  4. System.out.print("print " + message);
  5. }
  6. }
  7. @Test
  8. public void test() {
  9. String name = "com.demo.Persion";
  10. Class serviceClass = Class.forName(name);
  11. Object obj = serviceClass.newInstance();
  12. //获得指定名称方法,如果有参数填上参数类型的Class类型
  13. Method print = serviceClass.getDeclareMethod("print",String.class);
  14. //私有方法如需要打开可见权限
  15. print.setAccessible(true);
  16. //指定某个对象调用方法,有参数就加上参数
  17. print.invoke(obj,"hahaha");
  18. //获得所有方法
  19. Method print = serviceClass.getDeclareMethods();
  20. for (Method method : methods) {
  21. method.setAccessible(true);
  22. //获得方法的参数
  23. Class<?>[] parameterTypes = method.getParameterTypes();
  24. }
  25. }

反射的实际使用场景

  1. Spring中的IOC控制反转。容器通过配置文件生产和DI都是依赖反射来实现的。传送门SpringIOC和DI
  2. 动态代理。Java的动态代理中生成代理对象就是通过反射获取接口和获取指定实现类创建实例。
  3. 编辑器的代码提示也是通过反射获取到类中的方法和属性

发表评论

表情:
评论列表 (有 0 条评论,180人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java反射机制

    百科: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法

    相关 Java反射机制

    1、什么是反射技术? 动态获取指定类以及类中的内容(成员),并运行其内容。 应用程序已经运行,无法在其中进行new对象的建立,就无法使用对象。这时可以根据配置文件的类全名去

    相关 Java反射机制

    Java反射机制 > 定义:在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性(包括私有的方法和属性)进行调

    相关 java反射机制

    什么是反射 > 反射是一种计算机处理方式。有程序可以访问、检测和修改它本身状态或行为的这种能力。能提供封装程序集、类型的对象。(程序集包含模块,而模块包含类型