Java反射机制提供的功能:
1、运行时判断任意一个对象所属的类
2、运行时构造任意一个类的对象
3、运行时判断任意一个类所有的成员变量和方法
4、在运行时获取泛型信息
5、在运行时调用任意一个对象的成员变量和方法
6、在运行时处理注解
7、生成动态代理
反射相关主要API
java.lang.Class:代表一个类
java.lang.reflect.Method:代表类的方法
java.lang.reflect.Field:代表类的成员变量
java.lang.reflect.Constructor.代表类的构造器
疑问:
1、 反射机制与面向对象的封装性是不是矛盾?如何看待两个技术
不矛盾,
2、通过直接new的方式或反射的方式都可以调用公共的结构,开发到底用那个
建议用new的方式,
什么时候会使用:反射的方式,反射的特征:动态性
哪些类可以有Class对象
1、class:
外部类,成员(成员内部类,静态内部类),局部内部类,匿名内部类
2、interface:接口
3、[]:数组
4、enum:枚举
5、annotation:注解@interface
6、primitive type:基本数据类型
7、void
//三种获取Class的实例都要掌握 //方法一调用运行时类的属性.class Class<Person> clazz1 = Person.class; System.out.println(clazz1); //方法二,通过运行时类的对象 Person p1 = new Person(); Class clazz2 = p1.getClass(); System.out.println(clazz2); // 方法三:调用Class的静态方法:forName(String classPath) Class clazz3 = Class.forName("com.alei.sping5.testDemo.Person"); System.out.println(clazz3);
Class clazz=Person.class; //通过反射,创建Person类的对象 Constructor cons = clazz.getConstructor(String.class,int.class); Object object = cons.newInstance("Tom", 12); Person p=(Person) object; System.out.println(object.toString()); //通过反射,调用对象指定的属性、指定的方法 Field age = clazz.getDeclaredField("age"); age.set(p,10); System.out.println(object); //调用方法 Method show = clazz.getDeclaredMethod("show"); show.invoke(p); //通过反射,可以调用Person类的私有结构。比如:私有的构造器、方法、属性 Constructor cons1 = clazz.getDeclaredConstructor(String.class); cons1.setAccessible(true); Person p1 = (Person) cons1.newInstance("Jerry"); System.out.println(p1); //调用私有的属性 Field name = clazz.getDeclaredField("name"); name.setAccessible(true); name.set(p1,"Hanmeimei"); System.out.println(p1.getName()); //调用私有方法。 Method showNation=clazz.getDeclaredMethod("showNation", String.class); showNation.setAccessible(true); String name1 = (String)showNation.invoke(p1, "中国");//相当于p1.shownation System.out.println(name1);