java反射

之前一直对反射蒙蒙圈圈的,今天才算彻底搞懂反射的真正意义,知识确实是需要不断的沉淀与积累,慢慢的就对之前接触过但是懵懂的地方有所突破,废话少说,开始正题。

什么是反射?
我个人理解的反射就是程序能动态的获取类的属性与方法。官方的反射就是在运行状态中,对于任意一个你知道名字的类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意方法和属性,并且能改变它的属性。

反射能做什么?
反射机制允许程序在运行时取得任何一个已知名称的class的内部信息,包括其modifiers(修饰符),fields(属性),methods(方法)等,并可于运行时改变fields内容或调用methods。这样我们便可以更灵活的编写代码,代码可以在运行时装配,无需在组件之间进行源代码链接,降低代码的耦合度,还有动态代理的实现等等,但是需要注意的是反射使用不当会造成很高的资源消耗。

静态加载与动态加载
new创建对象是静态加载类,在编译的时候就需要加载所有的可能使用到的类,如果是静态加载,如果没有创建对应所有的类,即使你想使用已经创建的类,也用不了(一个有问题,所有的都用不了)。通过动态加载类可以解决。可以new一个所有类的共同父类或者接口,如需要添加功能,则只需要实现该接口或者继承父类即可,不需要重新编译。

每一个类都是一个实例对象,是Class类的实例对象,这个对象我们称为该类的类类型。除了静态方法变量与基本数据类型,都是对象。

得到class的三种方式:

//1、通过对象调用 getClass() 方法来获取,通常应用在:比如你传过来一个 Object类型的对象,而我不知道你具体是什么类,用这种方法
   Person p = new Person();
   Class c1 = p.getClass();
         
//2、直接通过 类名.class 的方式得到,该方法最为安全可靠,程序性能更高,这说明任何一个类都有一个隐含的静态成员变量 class
   Class c2 = Person.class;
         
//3、通过 Class 对象的 forName() 静态方法来获取,用的最多,但可能抛出 ClassNotFoundException 异常
   Class c3 = Class.forName("Person");

getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。包括private 声明的和继承类
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
getConstructors():获得类的public类型的构造方法。
getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。

说说java泛型的本质:java中集合的泛型,是为了防止错误输入的,只在编译阶段有效,绕过编译就无效了,而反射的操作都是编译之后的操作。

我的参考:https://www.cnblogs.com/ysocean/p/6516248.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值