本章目标:
- 什么是反射reflect
- 什么是类类
- 如何获得"类对象"
- 反射三大作用:
动态实例化对象
动态调用方法
动态读写属性 - 访问修饰符
=================================================
-
什么是反射
反射java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法。
反射是框架设计的灵魂。
使用的前提条件:首先要得到Class文件。 -
什么是类类
描述所有狗的类 狗类:Dog 狗对象:旺财
描述所有猫的类 猫类:Cat 猫对象:肥波
描述所有类的类 类类:java.lang.Class 类对象:特定类 -
一切反射相关的代码都从获得“类对象”开始——获得类对象
类对象——即Class对象。
类的对象——通过类实例化的地象,如Object obj = new Object();常用三种获取方式:
3.1 Class.forName(完整类名)
//已知类的全路径名,通过全路径名获得类对象
Class c = Class.forName(“com.entity.Person”);
3.2 类名.class
Class c = Person.class;
3.3 对象.getClass()
Class c = p.getClass();
Class c = new Person().getClass();注1:ClassNotFoundException(类名错|少jar包)
注2:同一个类的类对象只会创建一个 -
反射三大作用(java.lang.reflect.*)
4.1 动态实例化对象
c.newInstance(); //类对象实例化对象
其他操作:
c.getName(); //获得类对象全路径名
c.getSimpleName(); //获得类对象的类名
c.getPackage() //获得当前类所在包
c.getSuperclass() //获得父类的class
c.getInterfaces() //获得接口
c.getConstructor() //返回public构造方法
c.getDeclaredConstructors() //返回带指定参数类型的构造方法(不区分public/private)
getParameterTypes() //构造方法参数类型
4.2 动态调用方法
c.getMethods() //返回所有public的方法,父类公开方法一并获得
c.getDeclaredMethods() //返回所有方法,获得当前类的
c.getDeclaredMethod(method-name, parameter) //返回指定方法
m.setAccessible(true) //对所有属性设置访问权限 当类中的成员变量为private时 必须设置此项
MethodName.invoke(对象,参数) //调用方法
案例1:
Class c = Student.class;
try {
Method me = c.getDeclaredMethod("abc", String.class);
me.invoke(new Student(), "abc");
} catch (Exception e) {
e.printStackTrace();
}
案例2:
Class c = Student.class;
Method m3 = c.getDeclaredMethod("add", Integer.class,Integer.class);
m3.setAccessible(true); //授权
Object v3 = m3.invoke(new Student(), 10,20);
System.out.println(v3);
4.3 动态读写属性
c.getFields() //返回所有公开的属性
c.getField(String) //返回某个公开的属性
c.getDeclaredFields() //返回所有属性(任意访问权限)
c.getDeclaredField(String) //返回指定私有属性
c.setAccessible(true) //为private属性设置赋值权限
属性.set(object, value) //为属性赋值
属性.get(obj) //获得obj对象的某值
案例:
Class c1 = Class.forName("p1.Student");
Field filed = c1.getDeclaredField("sid"); //返回私有属性
filed.setAccessible(true); //为private属性设置赋值权限
filed.set(c1.newInteace, "s007"); //赋值
String sid =(String) filed.get(s);
System.out.println(sid);
-
访问修饰符
c.getModifiers() //获得类、属性、方法的修饰符
c.getType() //获得类型5.1 Modifier类
Modifier.isStatic(int)
Modifier.isFinal(int)
Modifier.isPublic(int)
Modifier.isPrivate(int)
Modifier.isProtected(int)
Modifier.isAbstract(int)
Modifier.isInterface(int)
Modifier.Native(int)5.2 修饰符对应值
默认友好的 0
PUBLIC 1
PRIVATE 2
PROTECTED 4STATIC 8
FINAL: 16SYNCHRONIZED: 32
VOLATILE: 64
TRANSIENT: 128
NATIVE: 256
INTERFACE: 512
ABSTRACT: 1024
STRICT: 2048//将数值转换相应的修饰符
Modifier.toString(field.getModiers())
课外参考:
Java基础之—反射(非常重要)
https://blog.csdn.net/sinat_38259539/article/details/71799078
深入理解Java反射
https://www.cnblogs.com/luoxn28/p/5686794.html