一、何为反射

反射就是对于任何一个类都能知道这个类的的所有属性和方法,并且对于任何一个对象都能调用他的属性和方法,而且能修改其属性。

二、反射的作用

就我的理解来看,通常我们在写代码的时会非常强调代码的逻辑,Java中类之间的链接非常重要,造成很多时候代码耦合度过高,这时会造成很多问题。当使用反射来调用属性和方法时会降低代码的耦合度,更加方便。

三、示例

这里我写了一个完整的逻辑,其中运用了多个反射类。

定义两个接口:

packageNone8;public interfaceearth {

}

packageNone8;public interfaceanimal {

}

定义一个父类,为了简化没有写方法和属性:

packageNone8;public classsimplePerson {

}

定义一个person类继承上面两个接口和父类:

packageNone8;public class person extends simplePerson implementsanimal,earth{

String name;intage;public voidshwo() {

String s= String.format("姓名=%s,年龄=%d", name,age);

System.out.println(s);

}publicperson() {

}//这里的构造函数一定要设为public,不然通过动态加载类创建对象时会报错,读取不到这个构造函数

public person(String name,intage){this.name =name;this.age =age;

}

}

客户端类,运用反射来创建并初始化对象,查看类的继承关系和方法:

packageNone8;importjava.lang.reflect.Constructor;importjava.lang.reflect.InvocationTargetException;public classclient {public static void main(String[] args) throwsClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {//TODO Auto-generated method stub//通过反射,动态加载对象//无参构造函数//Class> 泛型 里面的?表示可以处理所有是通配符,里面的person表示处理person类

Class> c =Class.forName("None8.person");

person n=(person)c.newInstance();

n.name= "lemon";

n.age= 22;

n.shwo();//通过反射得到所有构造函数getConstructors//这里有多个构造函数,上面的那个不能加载有参数的构造函数//通过getConstructors来得到所有的构造函数,构造函数存放在数组中//注意,构造函数一定要设为public,不然会报错

Constructor>[] cons =c.getConstructors();

person m= (person) cons[1].newInstance("sunk",30);

m.shwo();//通过反射得到所有接口getInterfaces//可以将所有继承的接口都展示出来//接口同样存放在数组中

System.err.println("接口有:");

Class>[] inter =c.getInterfaces();for (int i = 0;i < inter.length;i++) {

System.err.println(inter[i].getName());

}

System.err.println("父类有:");//通过反射得到所有父类getSuperclass//Class super Object> superc = (Class super Object>) c.getSuperclass();

System.err.println(c.getSuperclass().getName());

}

}

运行结果:

三、总结

我在刚接触反射的时最疑惑的就是我们之前通常用的new和反射中Class.forName()与Class.forName().newInstance()三者之间的关系。后来通过查询资料了解了。new只是一个关键字,后两者都是Class类下的方法。Class.forName()在反射中用来动态加载类,创建的对象的类型为该类的类型,这就可以看出来单单使用Class.forName()这个方法所创建的对象我们是无法使用的,这时就要使用newInstance()方法静态方法来实例化对象。

这里仅仅只是我对反射的浅显的理解,一边学习一边分享!

如有错误,希望大家能指正,感谢!

努力努力再努力!

java反射 用处_浅谈Java反射相关推荐

  1. java对象头_浅谈java对象结构 对象头 Markword

    概述 对象实例由对象头.实例数据组成,其中对象头包括markword和类型指针,如果是数组,还包括数组长度; | 类型 | 32位JVM | 64位JVM| | ------ ---- | ----- ...

  2. java bitset用途_浅谈Java BitSet使用场景和代码示例

    搜索热词 @H_502_0@一.什么是BitSet? @H_502_0@ 注:以下内容来自JDK API: @H_502_0@ BitSet类实现了一个按需增长的位向量.位Set的每一个组件都有一个b ...

  3. java 多线程同步_浅谈Java多线程(状态、同步等)

    Java多线程是Java程序员必须掌握的基本的知识点,这块知识点比较复杂,知识点也比较多,今天我们一一来聊下Java多线程,系统的整理下这部分内容. 一.Java中线程创建的三种方式: 1.通过继承T ...

  4. java手动回收_浅谈java是如何做资源回收补救的

    学习java的过程,我们经常谈论一个对象的回收,尤其是资源类型,如果没有显示的关闭,对象就被回收了,说明出现了资源泄漏.java本身为了防止这种情况,做了一些担保的方式,确保可以让未关闭的资源合理回收 ...

  5. java同名函数_浅谈Java 继承接口同名函数问题

    在Java中如果一个类同时继承接口A与B,并且这两个接口中具有同名方法,会怎么样? 动手做实验: interface A{ void fun(); } interface B{ void fun(); ...

  6. java并发计数器_浅谈java并发之计数器CountDownLatch

    CountDownLatch简介 CountDownLatch顾名思义,count + down + latch = 计数 + 减 + 门闩(这么拆分也是便于记忆=_=) 可以理解这个东西就是个计数器 ...

  7. java list翻转_浅谈Java数据结构中的常见问题

    1.常用数据结构 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素间的关系组成.常用的数据有:数组.栈.队列.链表.树.图.堆.散列表. 1)数组:在内存中连续存储多个元素的 ...

  8. 00005在java结果输出_浅谈Java反序列化漏洞原理(案例未完善后续补充)

    摘要: 0005,这个16进制流基本上也意味者java反序列化的开始:(2)HTTP:必有rO0AB,其实这就是aced0005的base64编码的结果:以上意味着存在Java反序列化,可尝试构造pa ...

  9. java 匿名类_浅谈Java的匿名类

    在实际的项目中看到一个很奇怪的现象,Java可以直接new一个接口,然后在new里面粗暴的加入实现代码.就像下面这样.那么问题来了,new出来的对象没有实际的类作为载体,这不是很奇怪吗? 思考以下代码 ...

最新文章

  1. “性能调优”坑惨了几十万程序员
  2. Android 基础(十六) Toast
  3. 【转】上篇:陈皓谈程序员升级:职业规划就像软件工程
  4. 【Linux高频命令专题(23)】tar
  5. 电子信息工程这个专业学的是什么内容,就业怎么样?
  6. 现实竞争激烈,学透才能在职场做个风云人物,单片机存储器篇
  7. atitit.php 流行框架 前三甲为:Laravel、Phalcon、Symfony2 attilax 总结
  8. 必杀技———SQL基础整理系列(一)
  9. 【转载】【原创】贵在,难在,成在
  10. 华为hwics格式产品文档打开方式
  11. oracle数据的闪回——删库跑路?老铁别想了!
  12. Vue入门(Vue.js,库与框架,MVVM,BootCDN,Vue入门,数据双向绑定,vue事件,生命周期,钩子函数 )
  13. html5视频制作,iH5最专业的H5制作工具
  14. 测试岗位只有一个人的公司中,如何做好测试?
  15. 记一次重大的生产事故
  16. LVIS Challenge 2021长尾分布实例分割冠军解决方案
  17. 哔哩哔哩php开发工作怎么样,[上海] [哔哩哔哩]-努力寻求[PHP /C++/Andro/iOS/前端开发工程师]-会是你吗?...
  18. Laravel框架中上传图片
  19. C语言操作SQLite3简明教程
  20. #父与子的编程之旅#第十三章

热门文章

  1. linux 内核 LINUX_VERSION_CODE 和 KERNEL_VERSION 宏定义 版本信息
  2. web前端 react与vue 流行框架的比较
  3. FSD HOOK与SSDT HOOK恢复简单思路
  4. 代码注入之远程线程篇
  5. Linux C编程--网络编程2--面向连接的网络编程
  6. java设计模式---调停者模式
  7. QEMU和KVM 中断处理过程
  8. 算法 - 堆排序(C#)
  9. mysql安装到最后报错_mysql 安装到最后一步时,start service 为失败状态
  10. 个人觉得非常好的B树,B+树的总结