• 系统开发系列 之java反射以及应用


    1 概述:
    反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
    当程序使用某个类时,如果该类还没有加载到内存,则系统会通过加载(将class文件读入内存并为之创建一个class对象)、连接(验证 准备 解析)、初始化三步实现对类的初始化。
    加载时机:创建类的实例、访问类的静态变量、访问类静态方法、使用反射方式强制创建某个类或者接口对应的java.lang.class对象。
    字节码文件:.java文件经过虚拟机编译成.class文件,也叫字节码文件。Java在将.class字节码文件载入时,JVM将产生一个java.lang.Class对象代表该.class字节码文件,从该Class对象中可以获得类的许多基本信息,这就是反射机制。
    反射作用:普遍用于底层封装;用于动态代理。
    反射劣势:从代码的阅读性来看,反射不太友善;其次,不易于功能维护;之后,反射破坏了抽象性,因此当平台发生改变的时候,代码的行为就有可能也随着变化;最后,反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题。

    2 应用:
    Object类的getclass()方法:判断两个类是否为同一个字节码文件;
    Class类中静态方法forName()方法:读取配置文件;
    Class类的newInstance()方法:使用该类无参构造方法创建对象;
    Class类的getConstructor(String.class , int.class)方法:获取一个指定的构造函数,然后调用Constructor类的newInstance(“AB” , 12)来创建对象;
    获取成员变量并使用:Class.getField(String)方法可以获取类中指定字段,如果私有可以用getDeclaedField(String)方法获取,通过set()方法设值,私有需要调用setAccessible(true)设置访问权限,用获取的字段调用get(obj)获取该对象字段的值;
    通过反射越过泛型检查:泛型只在编译期有效,运行期擦除掉:–例子如下–

    public void setProperty(Object obj, String Property, Object value) {
    	Classclazz = obj.getclass();
    	Field f = clazz.getDeclaedField(Property);
    	f.setAccessible(true);
    	f.set(obj, value);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    java 使用反射调用方法:每个Method的对象对应一个具体的底层方法。获得Method对象后,程序可以使用Method里面的invoke方法来执行该底层方法。–例子如下–

    public class Obj {
    	public String showMethod1(String name){//用反射的方法来调用正常的方法
            return name+",您好!showMethod1";
        }
        
        public String showMethod1(List<String> name){//用反射的方法来调用正常的方法
            return name+",您好!showMethod1";
        }
        
        public String showMethod2(String name){//用反射的方法来调用正常的方法
            return name+",您好!showMethod2";
        }
    }
    
    
    public static void main(String[] args) {
    	try {
    			List<String> name = new ArrayList<>();
    			name.add("123");
    			
    			Class<Dept> c = Dept.class;
    			Method m = c.getMethod("showMethod1", String.class);
    			Object o = m.invoke(c.newInstance(), name.get(0));
    			System.out.println("反射调用的方式:" + o);
    
    			Class<Dept> c = Dept.class;
    			Method m = c.getMethod("showMethod2", String.class);
    			Object o = m.invoke(c.newInstance(), name.get(0));
    			System.out.println("反射调用的方式:" + o);
    
    			Class<Dept> c = Dept.class;
    			Method m = c.getMethod("showMethod1", List.class);
    			Object o = m.invoke(c.newInstance(), name);
    			System.out.println("反射调用的方式:" + o);
    	} catch (Exception e) {
    			e.printStackTrace();
    		}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    参考资料:
    https://www.cnblogs.com/fanweisheng/p/11136833.html java 使用反射调用方法
    https://blog.csdn.net/Jackyyl729/article/details/109502965 反射的作用及意义

  • 相关阅读:
    Ubuntu系统中安装libcurl库用来做爬虫
    【安全开发】python—dgango框架
    Windows内存管理总结
    [需求管理-8]:需求分析 - 商业价值评判和确认
    代码随想录算法训练营第27天|39. 组合总和 40.组合总和II 131.分割回文串
    VCED:AI能用文字自动剪切视频?|datawhale开源项目
    Java项目实战《苍穹外卖》 三、登录功能
    基于变压器的手持式超声图像中乳腺病变的分类不一致性测量表征
    iPhone开发--Xcode15下载iOS 17.0.1 Simulator Runtime失败解决方案
    Redis 中新的三种数据类型
  • 原文地址:https://blog.csdn.net/langxiaolin/article/details/126690264