java反射机制(应用大于实践)

定义:
加载一个运行时才知道的类以及它的完整内部结构。

Class<PeStudent> studentClass = PeStudent.class;

API解释:
1 Class 类的实例表示正在运行的 Java 应用程序中的类和接口。
2 每个数组,所有具有相同元素类型和维数的数组都共享该 Class 对象。
基本的 Java 类型(boolean、byte等)和关键字 void 也表示为 Class 对象
3 Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。

应用:
Class对象获取类加载器:
ClassLoader classLoader = PeStudent.class.getClassLoader();
常用来获取文件绝对路径:
String path = classLoader.getResource("").toURI().getPath();

获取的构造函数进行创建对象:
Constructor[] constructors = PeStudent.class.getConstructors();
PeStudent peStudents = (PeStudent) constructors[0].newInstance("11","11","11");
System.out.println(peStudents);

Constructor constructor = PeStudent.class.getConstructor(String.class, String.class);
PeStudent peStudent = (PeStudent) constructor.newInstance("aa", "cc");
System.out.println(peStudent);

根据方法名称以及参数Class对象,获取指定的method
Method method = PeStudent.class.getMethod("method");
Method method = PeStudent.class.getMethod("aa", String.class);
System.out.println(method.invoke(new PeStudent("1", "2"), "张三"));

通过Field类给字段设置值 getField、getDeclaredField 区别前者访问公共成员,后者可以访问到所有成员
PeStudent peStudent = new PeStudent("原值name", "age3岁");
Field field = PeStudent.class.getDeclaredField("name");
field.setAccessible(true); // 参数值为true,禁止访问控制检查
field.set(peStudent, "替换name");

isInstance 判断是否为某个类的实例
System.out.println(PeStudent.class.isInstance(new PeStudent()));

 

凌晨5点的北京你见过吗?我没有...

共勉

posted @ 2018-07-20 19:48  帅少1993  阅读(230)  评论(0编辑  收藏  举报