java学习-反射

首先声明java中反射的定义,概念,与作用。
java中的反射可以直接获取类的属性和方法,从功能上来讲,反射与直接new一个新的对象并没有什么不同。
但是从灵活程度上来讲,反射可以更灵活的构造程序,这种灵活框架系统层面上。
以框架举例,一个框架的开发者,并不知道框架的使用者会写什么class和method来进行使用者自身业务需求的开发,那么框架的开发者也不可能得知使用者到底有什么class,这就造成了开发者在进行框架开发时的困难,无法得知类的包和名,便无法直接通过new来新建并操纵这个类。
建立在这种困难与需求之上,我们就可以使用反射,通过传入一个string的完整包名和类名,通过装载器对这个类进行装载,实现这个类的各种属性与方法。同时我们还可以利用反射的机制,来绕过类的私有安全检查,直接调用类的private或者protect方法。
示例代码:
<span style="white-space:pre">	</span>ClassLoader classLoader = Thread.currentThread().getContextClassLoader();<span style="white-space:pre">	</span>//获得当前的线程
        Class clazz = classLoader.loadClass("com.invoker.study.Car");<span style="white-space:pre">			</span>//你想加载的类名 必须要有完整的路径名
        Car car = (Car) clazz.newInstance();<span style="white-space:pre">						</span>//根据之前的类名 来获得一个新的实现
        Method setBrand = clazz.getMethod("setBrand", String.class);<span style="white-space:pre">			</span>//根据之前的类型 来获得一个方法的实例
        setBrand.invoke(car, "3325112");<span style="white-space:pre">						</span>//调用Method.inovke方法,来对之前的方法进行操作 这里的作用car.setBrand()相同

        //通过反射方法绕过安全机制设置私有类
        Field carFld = clazz.getDeclaredField("brand");<span style="white-space:pre">					</span>//通过getDeclareField方法来获得对象的一个私有属性
        carFld.setAccessible(true);<span style="white-space:pre">							</span>//取消私有验证
        carFld.set(car,"??");<span style="white-space:pre">								</span>//设置这个私有属性
        return car;


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值