首页 > 其他分享 >反射

反射

时间:2022-10-13 22:44:49浏览次数:42  
标签:aClass 反射 public method Cat properties

问题的提出

  • 需求

    • 根据配置文件re.properties指定信息,创建Cat对象并调用方法hi
    • classfullpath=com.hspedu.Cat
    • method=hi
  • Cat.java

package com.hspedu;

public class Cat {
    public void hi(){
        System.out.println("喵喵喵~");
    }
}
  • re.properties
classFullPath=com.hspedu.Cat
method=hi
  • ReflectionQuestion.java
public class ReflectionQuestion {
    public static void main(String[] args) {
        //传统的方式创建Cat
        Cat cat = new Cat();
        cat.hi();
        //使用properties配置文件创建类,不适用反射则无法创建类
    }
}

初识反射

public class ReflectionQuestion {
    public static void main(String[] args) throws Exception {
        //传统的方式创建Cat
        Cat cat = new Cat();
        cat.hi();
        //使用properties配置文件创建类,不适用反射则无法创建类

        //---------------使用反射机制解决------------------
        Properties properties = new Properties();
        properties.load(new FileInputStream("src/main/resources/re.properties"));
        //获取配置文件中的类路径和方法
        String classFullPath = properties.get("classFullPath").toString();
        String methodName = properties.get("method").toString();

        //1.加载类
        Class aClass = Class.forName(classFullPath);
        //2.通过aClass得到你加载的类 com.hspedu.Cat
        Object o = aClass.newInstance();
        //3.通过aClass得到加载类com.hspedu.Cat的methodName(hi)方法。在反射中可以把方法当做对象
        Method method = aClass.getMethod(methodName);
        //通过method调用方法,即通过方法对象来实现调用方法
        method.invoke(o);   //输出 喵喵喵~
    }
}
  • 在不修改源码的情况下来控制程序(修改配置),新建cry方法。修改配置文件method=cry则直接调用cry方法不需要修改ReflectionQuestion的源码
public class Cat {
    public void hi(){
        System.out.println("喵喵喵~");
    }
    
    public void cry(){
        System.out.println("wuwuwu~");
    }
}

反射机制

  • Java Reflection
    • 反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息(如成员变量,构造器,成员方法等等),并能操作对象的属性及方法。反射在设计模式和框架底层都会用到
    • 加载完类之后,在堆中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象包含了类的完整结构信息。通过这个对象得到类的结构,这个对象就向一面镜子,透过这个镜子看到类的结构,所以,形象的称之为反射
  • Java反射机制可以完成
    • 在运行时判断任意一个对象所属的类
    • 在运行时构造任意一个类的对象
    • 在运行时得到任意一个类所具有的成员变量和方法
    • 在运行时调用任意一个对象的成员变量和方法
    • 生成动态代理
  • 反射相关的主要类
    • java.lang.Class:代表一个类,Class对象表示某个类加载后在堆中的对象
    • java.lang.reflect。Method:代表类的方法
    • java.lang.reflect.Field:代表类的成员变量
    • java.lang.reflect.Constructor:代表类的构造方法

  • Cat.java
public class Cat {

    public String name = "小猫";

    public Cat(){

    }

    public Cat(String name){
        this.name = name;
    }

    public void hi(){
        System.out.println("喵喵喵~");
    }

    public void cry(){
        System.out.println("wuwuwu~");
    }
}

public class Reflection01 {
    public static void main(String[] args) throws Exception {
        Properties properties = new Properties();
        properties.load(new FileInputStream("src/main/resources/re.properties"));
        //获取配置文件中的类路径和方法
        String classFullPath = properties.get("classFullPath").toString();
        String methodName = properties.get("method").toString();

        //加载类
        Class aClass = Class.forName(classFullPath);
        //通过aClass得到你加载的类 com.hspedu.Cat
        Object o = aClass.newInstance();
        //通过aClass得到加载类com.hspedu.Cat的methodName(hi)方法。在反射中可以把方法当做对象
        Method method = aClass.getMethod(methodName);
        //通过method调用方法,即通过方法对象来实现调用方法
        method.invoke(o);   //输出 喵喵喵~

        //得到name字段,不能获取私有的属性
        Field nameField = aClass.getField("name");
        // 传统写法:对象.成员变量  反射: 成员变量.get(对象)
        System.out.println(nameField.get(o));   //输出 小猫
    }
}
  • 反射优点和缺点
    • 优点:可以动态的创建爱你和使用对象(也是框架底层核心),使用灵活
    • 缺点:使用反射基本是解释执行,对执行速度有影响

标签:aClass,反射,public,method,Cat,properties
From: https://www.cnblogs.com/blackyoumo/p/16789731.html

相关文章

  • Shooter项目 ++反射
    反射是程序在运行时获取程序数据的一种方式(uec++中模拟反射将C++数据暴露在蓝图中,并管理内存垃圾删除)UHT可以通过收集宏来生成特殊的附加代码Wchar_t(宽字符)  :Wchar......
  • 反射_Class对象功能_获取Constructor与注解_概念
    反射_Class对象功能_获取Constructor案例:需求:写一个“框架”,不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法实现:......
  • 反射_Class对象功能概述与反射_Class对象功能_获取Field
    反射_Class对象功能概述Constructor:构造方法创建对象;TnewInstance​(Object...initargs)使用由此Constructor对象表示的构造函数,使用指定的初始化参......
  • Java反射解析注解
     packagecom.jeeplus.config;importjavax.validation.constraints.Size;importjava.lang.annotation.Annotation;importjava.lang.reflect.Field;importjava.......
  • 反射_Class对象功能概述与反射_Class对象功能_获取Field
    反射_Class对象功能概述Constructor:构造方法创建对象;TnewInstance​(Object...initargs)使用由此Constructor对象表示的构造函数,使用指定的初始化......
  • Java反射
    今天了解到一个不太常用但是面试可能需要学习的Java基础知识点——反射 反射原理根据查询资料来看大概知识点有这些:Java语言允许通过程序化的方式间接对Class进行操......
  • JAVA反射Runtime类研究
    Runtime类在java中一般类的调用方法是new类();所以我们使用newRuntime()来实例化一个Runtime类的对象importjava.io.IOException;publicclassmain{public......
  • Java小白学习笔记——反射
    快速入门一,反射概述反射机制       上述程序的返回值  反射获取对象 方式一在编译阶段使用,一般多在通过读取配置文件获取方式二在加载......
  • Java_类加载器&反射&模块化
    Java_类加载器&反射&模块化1.类加载器1.1类加载【理解】类加载的描述当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过类的加载,类的连接,类的初始化这......
  • 玩转Go反射
    反射反射常用于各种框架类当中,它可以做到十分优雅的帮我们读取值、设置值Go语言当中感觉很多反射的工具类,比如Java中的hutool,并没有很好的支持我总结下来反射可以分为两......