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

Posted 琅晓琳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了系统开发系列 之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 反射的作用及意义

以上是关于系统开发系列 之java反射以及应用的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

Java之反射 — 用法及原理

对Java反射的理解,应用举例:修改Tomcat Request Headers