**
反射
**
一、反射概念
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));
总结
反射是重点中的重点,分享到此结束!!!!