反射

9 篇文章 0 订阅

反射

  1. 为什么要学反射
  2. 什么是反射
  3. 获取类对象
  4. 反射的三大作用
  5. 用反射可能会出现的错误

为什么要学反射

反射是框架的核心,可以提高开发效率,是框架的基石(让代码更加有灵活性)

什么是反射

反射是java语言中的一种机制,通过这种机制可以动态的实例化对象,调用方法,读写属性(能够将未知的对象进行实例化)

获取类对象

1.Class.forName(完整类名)
2.类名.classs
3.对象.getClass


Class<?> c1 = Class.forName("com.lishengnan.reflect.Student");
	System.out.println(c1);
	
	System.out.println("___________________________________________________________");
	
	Class c2=Student.class;
	System.out.println(c2);
	
	System.out.println("____________________________________________________________");
	
	Student stu=new Student();
	Class c3=stu.getClass();
	System.out.println(c3);

呈现的结果
在这里插入图片描述

反射的三大作用

1.实例化对象
公有的实例化 x.newInstance()

Constructor<? extends Student> c= c1.getConstructor(String.class);
	Student stu3 = c.newInstance("s002");
	System.out.println(stu3);

私有的实例化

Constructor<? extends Student> c3= c1.getDeclaredConstructor(Integer.class);
	c3.setAccessible(true);
	Student stu5=c3.newInstance(20);
	System.out.println(stu5);

呈现的结果
在这里插入图片描述

oop与反射实例化的区别
oop实例化对象,处理的是业务逻辑的
反射实例化对象,就算没有实体类,也同样可以new对象

//oop实例化
	Student stu1=new Student();
	Class c1=stu1.getClass();
	
	System.out.println("------------------------------");
	
	//反射实例化
	Object stu2 = (Student)c1.newInstance();
	System.out.println(stu2);

呈现的结果

在这里插入图片描述

2.动态调用方法
Method m;
m.invoke
动态被调用得方法,如果是void类型返回值,那么invoke结果为null,
如果不是void类型返回值,那么invoke结果就是被调用方法的结果

Student stu1=new Student();
	Class c1=stu1.getClass();

动态被调用得方法,如果是void类型返回值,那么invoke结果为null
	Method m = c1.getMethod("hello");
	Object invoke = m.invoke(stu1);
	System.out.println(invoke);

System.out.println("-----------------------------------------");

如果不是void类型返回值,那么invoke结果就是被调用方法的结果
Method m3 = c1.getDeclaredMethod("add", Integer.class,Integer.class);
	m3.setAccessible(true);
	Object invoke3 = m3.invoke(stu1, 20,8);
	System.out.println(invoke3);

呈现的结果
在这里插入图片描述
3.读写属性

Student stu1=new Student("s001","可乐");
	Class c1=stu1.getClass();
	Field f = c1.getDeclaredField("sname");
	f.setAccessible(true);
	System.out.println(f.get(stu1));

呈现的结果
在这里插入图片描述
用反射可能出现的错误
NoSuchMethodException 没有此构造方法

IllegalAccessException 非法访问

在这里插入图片描述

注:x.getConstructor 获取到公开的构造方法
x.getDeclaredConstructor 可以获取到任何修饰符的构造方法

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值