系统开发系列 之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);
}

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();
		}
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值