Java反射机制
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);

浙公网安备 33010602011771号