反射从0到入门 (7)

运行结果:

Person
Person 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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyfwdg.html