运行结果:
PersonPerson age:30
Person name:不是秃头的小李程序员
Person toString:Person{name='不是秃头的小李程序员-35', age=35}
小结
通过上面的结果,得出以下结论:
通过 Class 实例的 newInstance() 获取到的是无参构造函数
获取有参构造函数需要通过 Class 实例获取 Constructor 实例,获取方法:getConstructor(),getConstructors(),getDeclaredConstructor(Class… parameterTypes),getDeclaredConstructors()
通过 Constructor 的 newInstance(Object… parameters) 创建实例对象
调用非 public 的 Contructor,需要通过设置 setAccessible(true) 设置允许访问,但可能会失败。
Interface我们可以通过 Class 的 getInterfaces() 获取当前类实现的所有接口,示例如下:
public class ReflectionInterfaceTest {public static void main(String[] args) {
Class s = Integer.class;
Class[] interfaces = s.getInterfaces();
for (Class c:interfaces){
System.out.println(c);
}
}
}
运行结果:
interface java.lang.Comparable总结
通过本文你大概了解了反射,让我们再复习一下:
反射是 Java 的特性之一,可以通过反射动态的获取对象。
反射的用途:代理模式等设计模式;通过 JDBC 连接数据库;Spring 框架动态加载对象
反射的优点:动态加载、提高代码的灵活度
反射的缺点:性能问题、安全限制、内部暴漏
反射的使用:通过获取到 Class 实例,就能获取到我们想要的所有信息,包括获取成员变量、方法和构造函数,分别对应的是 Field,Method 和 Constructor。可以通过这些类的内部方法获取信息,例如:通过getName() 获取名称。
如果我们修改或者访问带有 private 的变量或方法,需要先设置 method.setAccessible(true),才可以进行后续的操作。
下一节我带你们看看反射的原理,让我们更进一步的了解它。
参考https://blog.csdn.net/carson_ho/article/details/80921333
https://zhidao.baidu.com/question/1639472919001036380.html
https://www.liaoxuefeng.com/wiki/1252599548343744/1264803033837024