在java中反射降低了模块间的依赖性这个过程称解耦---高内聚,低耦合

在java中,万物皆对象,则将字节码看成一个对象,将一个方法看成一个对象.....

反射--剖析类,分析类的字节码,产生对象的字节码对象以及实例对象

  Class---代表字节码的类---代表类的类

  Field---代表属性的类

  Method---代表方法的类

  Constructor---代表构造方法的类

  Package--代表包的类

如何获取一个类的对象:(三种方式)

  1. 通过对象的getClass()方法来获取这个对象所对应的类的字节码对象;

  2. 通过类名.class 的方式来获取代表这个类的字节码对象;

  3. 通过Class.forName()方法来获取这个字符串所代表的类的字节码对象;(用的比较多)

    Class<Person> c = (Class<Person>)Class.forName(“Reflect.Students.”);

重要方法

  forName(String className)---返回的是一个Class<?>;获得的是一个字节码对象(类的对象)

  newInstance()---创建字节码对象所对应的实例对象(必须是无参构造时)

  getConstructor(Class ... paramterTypes)---获取指定的构造函数,该构造函数必须是public的,

  getDeclaredMethod:--获取指定构造函数。是全部的构造函数(包括默认的和私有的),但是只能是本类的。

  1. import java.io.File;
  2. import java.io.FileInputStream;
  3. import java.lang.reflect.Constructor;
  4. import java.lang.reflect.Field;
  5. import java.lang.reflect.Method;
  6. import java.text.SimpleDateFormat;
  7. import java.util.Properties;
  8.  
  9. import java.util.Date;
  10.  
  11. public class ProfessionDemo {
  12. public static void main(String[] args) throws Exception {
  13. File file = new File("D:\\Workspaces\\SGB1704\\bin\\Reflect\\config.properties");
  14. Properties pro = new Properties();
  15. pro.load(new FileInputStream(file));
  16.  
  17. String classname = pro.getProperty("classname");
  18. String[] attrname = pro.getProperty("attrname").split("/");
  19. String[] attrvalue = pro.getProperty("attrvalue").split("/");
  20. String methodname = pro.getProperty("methodname");
  21.  
  22. // 获取字节码对象
  23. Class<Profession> pf = (Class<Profession>) Class.forName(classname);
  24. // 参数类型
  25. Class[] parameterList = { String.class, int.class, Date.class,char.class };
  26. // 列举参数
  27. Object[] objargs = new Object[] {
  28. attrvalue[0],
  29. Integer.parseInt(attrvalue[1]),
  30. new SimpleDateFormat("yyyy-MM-dd").parse(attrvalue[2]),
  31. attrvalue[3].charAt(0)
  32. };
  33. // 获取构造函数
  34. Constructor<Profession> prop = pf.getDeclaredConstructor(parameterList);
  35. // 实例化对象(有参构造)
  36. Profession p = prop.newInstance(objargs);
  37. // 遍历属性名
  38. for (int i = 0; i < attrname.length; i++) {
  39. // 每个参数名
  40. String attrnameStr = attrname[i];
  41. // 根据属性名来获取这个属性对象
  42. Field f = pf.getDeclaredField(attrnameStr);
  43. Class fpf = f.getType();
  44. // 拼接出set方法
  45. String setMethodName = "set"
  46. + attrnameStr.substring(0, 1).toUpperCase()
  47. + attrnameStr.substring(1);
  48. // 获取指定方法
  49. Method setMothod = pf.getMethod(setMethodName, fpf);
  50. // 判断类型执行不同的方法
  51. if (fpf == int.class || fpf.equals(Integer.class)) {
  52. setMothod.invoke(p, Integer.parseInt(attrvalue[i]));
  53. } else if (fpf.equals(Date.class)) {
  54. setMothod.invoke(p,
  55. new SimpleDateFormat("yyyy-MM-dd").parse(attrvalue[i]));
  56. } else if (fpf == char.class || fpf.equals(Character.class)) {
  57. setMothod.invoke(p, attrvalue[i].charAt(0));
  58. } else {
  59. setMothod.invoke(p, attrvalue[i]);
  60. }
  61.  
  62. // 获取指定的方法
  63. Method m = pf.getDeclaredMethod(pro.getProperty("methodname"), null);
  64.  
  65. // 执行指定的方法
  66. m.invoke(p, null);
  67.  
  68. }
  69.  
  70. }
  71.  
  72. }

java反射(基本知识)的更多相关文章

  1. Java反射-高级知识掌握

    PS:本文就Java反射的高级知识做下汇总,理清在什么情况下,我们应该去使用反射,提供框架的健壮性,ps:xieyang@163.com/xieyang@163.com

  2. Java反射-中级知识掌握

    PS:本文就Java反射常用的中级知识做下汇总和分析/cnxieyang@163.com/xieyang@e6yun.com

  3. java反射基础知识(五)反射应用实践

    详解Java反射各种应用   Java除了给我们提供在编译期得到类的各种信息之外,还通过反射让我们可以在运行期间得到类的各种信息.通过反射获取类的信息,得到类的信息之后,就可以获取以下相关内容: Cl ...

  4. java反射基础知识(三)

    原文地址:http://tutorials.jenkov.com/java-reflection/index.html http://www.cnblogs.com/penghongwei/p/329 ...

  5. java反射基础知识(二)

    1. 了解 Java 中的反射 1.1 什么是 Java 的反射 Java 反射是可以让我们在运行时获取类的函数.属性.父类.接口等 Class 内部信息的机制.通过反射还可以让我们在运行期实例化对象 ...

  6. java反射基础知识(一)

    一.反射 反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...

  7. Java反射基础知识

    反射机制就是可以把一个类,类的成员(属性.方法)当成一个对象来操作,也就是说,类,类的成员,我们在运行的时候可以动态的去操作它们. 所有的Java类都继承了Object类,在Object类中定义了一个 ...

  8. java反射基础知识(四)反射应用实践

    反射基础 p.s: 本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的Quick Start. 在应用反射机制之前,首先我们先来看一下如何获取一个对象对应的 ...

  9. Java反射实战

    一.背景 最近的项目中需要使用到Java 反射的知识,以前不怎么了解,也基本没怎么用过,抽出一片时间,来具体学习和实战下Java的反射!拿来和大家分享以及记录方便以后学习! 二.反射相关概念解析 1. ...

  10. java 反射基本认识

    java 反射基本认识 最近重新复习java反射的知识,有了新的理解. class类? 在面向对象中,万事万物皆对象.类也是个对象,是java.lang.class类的实例对象. public cla ...

随机推荐

  1. DES(Data Encryption Standard)数据加密标准

    DES算法入口参数 DES算法的入口参数有三个:Key.Data.Mode.其中Key为7个字节共56位,是DES算法的工作密钥.Data为8个字节64位,是要被加密或解密的数据;Mode为DES的工 ...

  2. springboot ueditor 使用心得

    1.将ueditor引入项目中会发现,图片不能上传,返回值意思是因配置文件错误,导致图片无法上传 默认情况是使用jsp初始配置文件,这就需要项目支持jsp解析 在maven中引入 <!--添加对 ...

  3. [剑指Offer] 11.二进制中1的个数

    [思路]如果一个整数不为0,那么这个整数至少有一位是1.如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话).其余所有位将不会 ...

  4. Oracle解决索引碎片功能

    我们开始时向一个空的带索引的表中插入大量数据后,是不会产生碎片问题的,但是,数据库经过很长一段时间的增删改查后,难免会出现碎片问题,影响数据库的性能,Oracle对于这一问题有自己的解决方案. 下面介 ...

  5. Android中有哪些好的开发框架?

    在安卓开发中,框架的使用必不可少,合理利用一些好的开发框架,往往可以达到事半功倍的效果.本文小编就将和大家分享安卓开发者不得不知的5款框架,一起来看看吧,新技能get走起~~ 1.thinkAndro ...

  6. android 与 小米1S刷机学习

    本文内容为本博客作者原创,转载请注明出处或者发私信. [名词] 1.ROM包 :安卓手机系统,以.ZIP结尾,类似windows的 win7系统包,300M-700M不止 2.卡刷(Recovery模 ...

  7. ZOJ 3496 Assignment | 二分+有上下界网络流

    题目: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3496 大概意思:给你一个网络,有源汇,在保证最大流的情况下求下面两 ...

  8. 【BZOJ 2879】[Noi2012]美食节 费用流

    思路同修车,就是多了一个骚气的操作:动态加边,我们通过spfa流的过程可以知道,我们一次只会跑一流量,最后一层边跑过就不会再悔改,所以说我们只会用到一大片里面的很少的点,所以我们如果可以动态加边的话我 ...

  9. 你知道HTML标签设计的本意吗?

    “DIV+CSS”这个词汇不知道害了多少人,也许其提出者本意并没有错,但是跟风者从表现曲解了其意思,认为整个页面就应当是DIV+CSS文件的组合.这样做,对于视觉上并没有什么影响,因为还原了之前设计的 ...

  10. Codeforces Round #515 (Div. 3) E. Binary Numbers AND Sum

    E. Binary Numbers AND Sum 题目链接:https://codeforces.com/contest/1066/problem/E 题意: 给出两个用二进制表示的数,然后将第二个 ...