后端与系统架构4093 字

Java-反射详细讲解

·全库 386 / 611

《Java-反射详细讲解》共 0.4 万字,通篇围绕 安全、需求、场景、权限 展开,归在「后端与系统架构」这一层。

覆盖安全需求场景权限

适合给 AI 系统搭底座、要管得住的人

目录骨架(8 节)
  1. 反射引出
  2. 一个需求
  3. 传统方法
  4. 反射方法
  5. 反射是什么
  6. 反射机制原理示意
  7. 反射机制可以完成
  8. 反射相关的主要类

前言

Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键

反射引出

一个需求

根据配置文件 re.properties 指定信息,创建 Cat 对象并调用方法 hi

classfullpath=com.jwt.Catmethod=hi

这样的需求在学习框架时很多,即在通过外部文件配置,在不修改源码的情况下,来控制程序。

传统方法

传统的方法是先 new 一个对象,然后再调用它的方法。

Cat cat = new Cat();cat.hi();

通过传统方法,确实可以调用 hi() 方法,但是这和我们的需求不一样,这里我们是要根据配置文件 re.properties 指定信息来完成。可以使用 Properties 来读取配置文件。

Properties properties = new Properties();
properties.load(new FileInputStream("src//re.properties"));
String classfullpath = properties.getProperty("classfullpath");
//"com.jwt.Cat"String methodName = properties.getProperty("method");
//"hi"System.out.println("classfullpath=" + classfullpath);
System.out.println("method=" + methodName);

​

然后需要创建对象,怎么创建对象呢?直接new classfullpath,这样不就好了嘛?嗯,想法不错,下回不要想了。现在的 classfullpath 可是字符串类型,怎么能去new呢。所以现有技术是做不到这个事情的。那么这里就要引入我们要将的重点——反射机制。

反射方法

public class ReflectionQuestion {   
    public static void main(String[] args) throws Exception { 
        //1. 使用Properties 类, 可以读取配置文件    
        Properties properties = new Properties();   
        properties.load(new FileInputStream("src//re.properties")); 
        String classfullpath = properties.getProperty("classfullpath");
        //"com.jwt.Cat"        
        String methodName = properties.getProperty("method");
        //"hi"       
        System.out.println("classfullpath=" + classfullpath);  
        System.out.println("method=" + methodName);   
        //2. 使用反射机制解决      
        //(1) 加载类, 返回Class类型的对象cls   
        Class cls = Class.forName(classfullpath);  
        System.out.println("cls = " + cls);     
        //(2) 通过cls得到你加载的类com.jwt.Cat的对象实例  
        Object o = cls.newInstance();    
        System.out.println("o 的运行类型=" + o.getClass()); 
        //运行类型       
        //(3) 通过cls得到你加载的类com.jwt.Cat的methodName "hi" 的方法对象   
        Method method = cls.getMethod(methodName);       
        //(4) 通过method 调用方法: 即通过方法对象来实现调用方法  
        method.invoke(o); 
    //传统方法对象.方法() , 反射机制:方法.invoke(对象)   
    }
}

​

反射机制还有一个优点,那就是可以通过外部文件配置,在不修改源码的情况下,来控制程序。比如这里,我在Cat 类下面再写一个方法,cry()方法,如果我们使用传统方法,要调用这个方法,是不是就要修改代码了,比如cat.cry();通过反射,只需在配置文件 re.properties 中,将 method=hi 改为 method=cry 就可以了。

反射是什么

简介

  • 反射机制允许程序在执行时借助于 Reflection API 取得任何类的内部信息(比如成员变量,构造器,成员方法等等),并能操作对象的属性及方法。
  • 在运行状态中,对象可以通过反射获取他的类,类可以通过反射拿到所有⽅法(包括私有),拿到的⽅法可以调⽤,总之通过“反射”,我们可以将Java这种静态语⾔附加上动态特性。
  • 加载完类之后,在堆中就产生了一个 Class 类型的对象(一个类只有一个Class对象) ,这个对象包含了类的完整结构信息。通过这个对象得到类的结构。这个 Class 对象就像一面镜子,透过这个镜子看到类的结构,所以,形象的称之为反射

资料里没有你的场景?

把你手上的数据和想解决的那个环节发上来,我们按具体情况回,不复述方法论。

发布需求