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

news/2024/5/19 4:01:06 标签: java, jvm, 面试, 反射, 动态代理

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)获取该对象字段的值;
通过反射越过泛型检查:泛型只在编译期有效,运行期擦除掉:–例子如下–

java">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方法来执行该底层方法。–例子如下–

java">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 反射的作用及意义


http://www.niftyadmin.cn/n/1223692.html

相关文章

多级下拉菜单(动态)

效果如下: 程序:/Files/ipusr/topmenu.rar后台脚本: --插入测试数据insertintotopmenu([ID],[parentId],[text],[url],[target],[IsBoot],[visible],[status])values(1,0,深圳,http://singlepine.cnblogs.com/articles/259955.html,self,0,false,深圳)insertintotopmenu([ID],[…

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

java使用反射给对象属性赋值的两种方法 主程序&#xff1a; /***/ public class TestReflectSet {private String readOnly;public String getReadOnly() {return readOnly;}public void setReadOnly( String readOnly ) {System.out.println("set");this.readOnly…

汇总c#常用函数和方法集

汇总c#常用函数和方法集 3、 变量.ToString() 字符型转换 转为字符串 12345.ToString("n"); //生成 12,345.00 12345.ToString("C"); //生成 &#xffe5;12,345.00 12345.ToString("e"); //生成 1.234500e004 12345.ToString("f4"); …

安全论文(非常好的资料!)

目录&#xff1a;安全Linux访问控制机制研究与实现层次化可修复密钥分配协议及其在电子政务中的应用电子商务中公平数据交换协议的设计与实现防火墙与***检测系统在校园网中结合应用的初探高速无线局域网HiperLAN2数据链路协议的原理及其实现公钥基础设施中证书撤销机制研究混沌…

系统开发系列 之MyEclipse创建WebService详细教程和调用教程

参考文献&#xff1a; https://blog.csdn.net/Zmj_Dns/article/details/104435559 MyEclipse创建WebService最详细&#xff08;避坑&#xff09;教程 https://zhangchong.blog.csdn.net/article/details/78892731?spm1001.2101.3001.6650.3&utm_mediumdistribute.pc_relev…

教你打开丢失密码的笔记本

对于笔记本电脑&#xff0c;最好不要轻易的设置密码&#xff0c;因为笔记本电脑的开机密码并不是象PC机那样存放在CMOS电路中可以通过放电清除的&#xff0c;目前较新的笔记本都是将密码保存在主板的几块逻辑电路中&#xff0c;我们个人是无法破解的&#xff08;此系列电脑&…

哈哈,毒霸可以直接关闭自动播放功能,真是太棒了

熊猫烧香泛滥时&#xff0c;给宇均、小新、青蛙提过这个功能&#xff0c;这个月的更新就加进去了&#xff0c;真不错。通过自动播放传播的病毒有熊猫烧香、威金&#xff0c;还有专门***卡巴的1980系列&#xff08;就是中毒后&#xff0c;直接改系统时间为1980前后的年份&#x…

成功原来这样简单

一位研究生在20层的摩天大楼里,每天面对那台计算机,在椅子上坐久了很累,整天腰酸背痛,浑身提不起一点力气,偶尔下楼买点东西也坐电梯,28岁就怀疑自己老了,失去了年轻人的活力,我的同事们也有同样的感觉,久而久之我们的办事效率和准确率都明显下降了感到疲惫,每天都有做不完的事…