当前位置: 首页 > news >正文

java反射(基本知识)

在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 }

 

转载于:https://www.cnblogs.com/tongxuping/p/6832492.html

相关文章:

  • CSS3实现鼠标移动到图片上图片变大(缓慢变大,有过渡效果,放大的过程是有动画过渡的,这个过渡的时间可以自定义)...
  • 中望CAD 2017机械版接口说明文档
  • 每天一算法 -- (排序算法总结)
  • 由int指令引发的中断(1301)
  • [NOI2005]月下柠檬树[计算几何(simpson)]
  • js-模块化requirejs
  • 海量数据处理:十道面试题与十个海量数据处理方法总结
  • 8Python全栈之路系列之MySQL触发器
  • 二、网络配置文件
  • shell并发处理mysql数据统计备份删除释放
  • HDU 1255 覆盖的面积(线段树+扫描线)
  • cocos2d-x lua 中使用protobuf并对http进行处理
  • SSH防暴力破解的解决方法
  • 第三篇:一个Spark推荐系统引擎的实现
  • 2017 计蒜之道 初赛 第一场 B.阿里天池的新任务
  • php的引用
  • 【EOS】Cleos基础
  • Android 架构优化~MVP 架构改造
  • css选择器
  • JavaScript 基础知识 - 入门篇(一)
  • laravel5.5 视图共享数据
  • Mysql5.6主从复制
  • Netty源码解析1-Buffer
  • nfs客户端进程变D,延伸linux的lock
  • React-flux杂记
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • vue-cli在webpack的配置文件探究
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 理解在java “”i=i++;”所发生的事情
  • 学习ES6 变量的解构赋值
  • 应用生命周期终极 DevOps 工具包
  • Prometheus VS InfluxDB
  • ​学习一下,什么是预包装食品?​
  • #Linux(make工具和makefile文件以及makefile语法)
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • $.each()与$(selector).each()
  • (a /b)*c的值
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (十)c52学习之旅-定时器实验
  • (一)Dubbo快速入门、介绍、使用
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)JAVA中的堆栈
  • *上位机的定义
  • .Net Core和.Net Standard直观理解
  • .net 简单实现MD5
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • ::
  • @Async注解的坑,小心
  • [30期] 我的学习方法
  • [Android 数据通信] android cmwap接入点
  • [AutoSar]BSW_Com02 PDU详解
  • [BUG] Authentication Error