反射与应用

介绍反射及作用

  • 反射(Reflect)是在运行时动态访问类与对象的技术

  • 反射是JDK1.2版本后的高级特性,隶属于java.lang.reflect

  • 大多数Java框架都基于反射实现参数配置、动态注入等特性

反射四个核心类

Class类

  • Class是JVM中代表“类和接口”的类

  • Class对象具体包含了某个特定类的结构信息

  • 通过Class对象可获取对应类的构造方法/方法/成员变量

image-20220526184026393

Constructor构造方法类

  • Constructor类是对Java类中的构造方法的抽象

  • Constructor对象包含了具体类的某个具体构造方法的声明

  • 通过Constructor对象调用带构造方法创建对象

image-20220526201933145

Method方法类

  • Method对象值代某个类中的方法的描述

  • Method对象使用classObj.getMethod()方法获取

  • 通过Method对象调用指定对象的应用方法

image-20220526205323578

Field成员变量类

  • Field对应某个具体类中的成员变量的声明

  • Field对象使用classObj.getField()方法获取

  • 通过Field对象可为某对象成员变量赋值/取值

image-20220526224931596

getDeclared系列方法说明

  1. getDeclaredConstructor(s)|Method(s)|Field(s)获取对应对象

  2. getConstructor(s)|Method(s)|Field(s)只能获取public对象

  3. 访问非作用域内构造方法、方法、成员变量,会抛出异常

产生异常

  1. ClassNotFoundException:类名与类路径书写错误时抛出“累无法找到”异常

  2. InstantiationException:非法访问异常,当在作用域外访问对象方法或成员变量时抛出

  3. IllegalAccessException:当对象无法被实例化,抛出“实例化异常”

  4. NoSuchMethodException:没有找到与之对应的格式的方法

  5. InvocationTargetException:当被调用方法的内部抛出了异常而没有被捕获时

  6. NoSuchFieldException:没有找到成员变量时跑出的异常

反射在项目中的应用

设置国家化配置文件config.properties

 language=pers.hua.i18n.Zhcn

创建国家化接口并调用接口

 public interface I18N {
     public String say();
 }
 public class Zhcn implements I18N {
     @Override
     public String say() {
         return "生命不息奋斗不止!";
    }
 }

创建Application

 public class Application {
     public static void main(String[] args){
         public static void say() {
        Properties properties = new Properties();
        String configPath = Application.class.getResource("/config.properties").getPath();
        try {
            configPath = new URLDecode().decode(congigPath,"UTF-8");
            properties.load(new FileInputStream(configPath));
            String language = configPath.getProperty("language");
            I18N i18n = (I18N)class.forName(language).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    }
 }
请登录后发表评论

    没有回复内容