反射

**

反射

**

一、反射概念

1.1概念

反射java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法

1.2为什么学反射?

提高开发效率

二、获取类对象

1、Class.forName(类的完整路径名)

Class<?> class1 = Class.forName("com.tanjie.Student");

2、类名.class

Class class2=Student.class;

3、对象.getClass()

Student stu=new Student();
Class<? extends Student> class3 = stu.getClass();

二、获取类对象

2.1无参共有的实例化

Student stu2 = (Student) class1.newInstance();

2.2有一个参数的共有的构造器实例化

Constructor<? extends Student> c2 = class1.getConstructor(String.class);
Student stu3=c2.newInstance("s001");

2.3有两个参数的共有构造器实例化

Constructor<? extends Student> c3=class1.getConstructor(String.class,String.class);
Student stu4=c3.newInstance("s001","张三");

2.4私有的构造器实例化

Constructor<? extends Student> c4 = class1.getDeclaredConstructor(Integer.class);
c4.setAccessible(true);
Student stu5 = c4.newInstance(22);

2.5注意

1、getDeclaredConstructor 能够获取到任意修饰符的构造方法 
2、java.lang.NoSuchMethodException  类中没有Inter为参数的构造方法
3、java.lang.IllegalAccessException  非法访问,因为这个构造器是private修饰,c.setAccessible(true)---》开放权限

三、调用方法

3.1 公开有参数的

Method m2 = clz.getMethod("hello", String.class);
Object invoke2 = m2.invoke(stu, "张三");

3.2 私有的

Method m3 = clz.getDeclaredMethod("add",Integer.class,Integer.class);
m3.setAccessible(true);
Object invoke3 = m3.invoke(stu, 20,4);

3.3注意

动态被调用方法,如果该方法是void返回值,那么被invoke,此时结果为null;
反之,返回该方法的结果

三、读写属性

3.1 公开的

Student stu=new Student();
stu.setSid("1");
stu.setSname("张三");
stu.age=18;
Class<? extends Student> clz = stu.getClass();
Field f3 = clz.getField("age");
f3.set(stu, 18);
System.out.println(f3.get(stu));

3.1 私有的

Student stu=new Student();
stu.setSid("1");
stu.setSname("张三");
stu.age=18;
Class<? extends Student> clz = stu.getClass();
Field f = clz.getDeclaredField("sname");
f.setAccessible(true);
f.set(stu, "李四");
System.out.println(f.get(stu));
Field f2 = clz.getDeclaredField("sid");
f2.setAccessible(true);
f2.set(stu, "2");
System.out.println(f2.get(stu));

总结

反射是重点中的重点,分享到此结束!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值