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:--获取指定构造函数。是全部的构造函数(包括默认的和私有的),但是只能是本类的。
import java.io.File;
import java.io.FileInputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Properties; import java.util.Date; public class ProfessionDemo {
public static void main(String[] args) throws Exception {
File file = new File("D:\\Workspaces\\SGB1704\\bin\\Reflect\\config.properties");
Properties pro = new Properties();
pro.load(new FileInputStream(file)); String classname = pro.getProperty("classname");
String[] attrname = pro.getProperty("attrname").split("/");
String[] attrvalue = pro.getProperty("attrvalue").split("/");
String methodname = pro.getProperty("methodname"); // 获取字节码对象
Class<Profession> pf = (Class<Profession>) Class.forName(classname);
// 参数类型
Class[] parameterList = { String.class, int.class, Date.class,char.class };
// 列举参数
Object[] objargs = new Object[] {
attrvalue[0],
Integer.parseInt(attrvalue[1]),
new SimpleDateFormat("yyyy-MM-dd").parse(attrvalue[2]),
attrvalue[3].charAt(0)
};
// 获取构造函数
Constructor<Profession> prop = pf.getDeclaredConstructor(parameterList);
// 实例化对象(有参构造)
Profession p = prop.newInstance(objargs);
// 遍历属性名
for (int i = 0; i < attrname.length; i++) {
// 每个参数名
String attrnameStr = attrname[i];
// 根据属性名来获取这个属性对象
Field f = pf.getDeclaredField(attrnameStr);
Class fpf = f.getType();
// 拼接出set方法
String setMethodName = "set"
+ attrnameStr.substring(0, 1).toUpperCase()
+ attrnameStr.substring(1);
// 获取指定方法
Method setMothod = pf.getMethod(setMethodName, fpf);
// 判断类型执行不同的方法
if (fpf == int.class || fpf.equals(Integer.class)) {
setMothod.invoke(p, Integer.parseInt(attrvalue[i]));
} else if (fpf.equals(Date.class)) {
setMothod.invoke(p,
new SimpleDateFormat("yyyy-MM-dd").parse(attrvalue[i]));
} else if (fpf == char.class || fpf.equals(Character.class)) {
setMothod.invoke(p, attrvalue[i].charAt(0));
} else {
setMothod.invoke(p, attrvalue[i]);
} // 获取指定的方法
Method m = pf.getDeclaredMethod(pro.getProperty("methodname"), null); // 执行指定的方法
m.invoke(p, null); } } }
java反射(基本知识)的更多相关文章
- Java反射-高级知识掌握
PS:本文就Java反射的高级知识做下汇总,理清在什么情况下,我们应该去使用反射,提供框架的健壮性,ps:xieyang@163.com/xieyang@163.com
- Java反射-中级知识掌握
PS:本文就Java反射常用的中级知识做下汇总和分析/cnxieyang@163.com/xieyang@e6yun.com
- java反射基础知识(五)反射应用实践
详解Java反射各种应用 Java除了给我们提供在编译期得到类的各种信息之外,还通过反射让我们可以在运行期间得到类的各种信息.通过反射获取类的信息,得到类的信息之后,就可以获取以下相关内容: Cl ...
- java反射基础知识(三)
原文地址:http://tutorials.jenkov.com/java-reflection/index.html http://www.cnblogs.com/penghongwei/p/329 ...
- java反射基础知识(二)
1. 了解 Java 中的反射 1.1 什么是 Java 的反射 Java 反射是可以让我们在运行时获取类的函数.属性.父类.接口等 Class 内部信息的机制.通过反射还可以让我们在运行期实例化对象 ...
- java反射基础知识(一)
一.反射 反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...
- Java反射基础知识
反射机制就是可以把一个类,类的成员(属性.方法)当成一个对象来操作,也就是说,类,类的成员,我们在运行的时候可以动态的去操作它们. 所有的Java类都继承了Object类,在Object类中定义了一个 ...
- java反射基础知识(四)反射应用实践
反射基础 p.s: 本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的Quick Start. 在应用反射机制之前,首先我们先来看一下如何获取一个对象对应的 ...
- Java反射实战
一.背景 最近的项目中需要使用到Java 反射的知识,以前不怎么了解,也基本没怎么用过,抽出一片时间,来具体学习和实战下Java的反射!拿来和大家分享以及记录方便以后学习! 二.反射相关概念解析 1. ...
- java 反射基本认识
java 反射基本认识 最近重新复习java反射的知识,有了新的理解. class类? 在面向对象中,万事万物皆对象.类也是个对象,是java.lang.class类的实例对象. public cla ...
随机推荐
- PHP+AJAX 实现表格实时编辑
https://blog.csdn.net/qq_29627497/article/details/81365107 源码链接:https://pan.baidu.com/s/1fAinVXU-nWt ...
- stap中的entry函数
只有在ret probe函数中,在这个函数中才会使用@entry函数去提取变量 是因为ret probe 有什么特殊的吗?在中间这个变量会变化吗? A new operator, @entry, is ...
- redis集群如何清理前缀相同的key
最近经常收到redis集群告警,每天收到50多封邮件,实在不胜其烦,内存不够用,原因是有一些无用的key(约3000万)占用内存(具体不说了).这部分内存不能被释放. 原来的定期清理脚本的逻辑: 打开 ...
- BZOJ4327 JSOI2012玄武密码(AC自动机)
当然可以在SA上二分答案,但看起来会被卡log.考虑对模板串建出AC自动机,用母串在上面跑,标记上所有能到达的点.注意到达某个点时需要标记所有其通过fail指针可以走到的点,如果遇到一个标记过的点就可 ...
- perl的Sys::Syslog模块(openlog,syslog,closelog函数,setlogsock)-自定义日志
perl的Sys::Syslog模块(openlog,syslog,closelog函数,setlogsock)-自定义日志 http://blog.chinaunix.net/xmlrpc.php? ...
- number 解题报告
number 题目描述 给定整数 \(m,k\),求出正整数 \(n\) 使得 \(n+1,n+2,-,2n\) 中恰好有 \(m\) 个数在二进制下恰好有 \(k\) 个 \(1\). 有多组数据. ...
- MySQL使用笔记(一)安装配置
By francis_hao Nov 27,2016 一般软件的安装都是可以通过源码和安装包安装,源码安装可配置性好些,安装包安装比较省事,况且使用yum也可以解决依赖的问题,基本实现了一键 ...
- Educational Codeforces Round 11 A
A. Co-prime Array time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- springboot与dubbo结合
转:http://www.cnblogs.com/Alandre/p/6490142.html 写的很好! 本文提纲 一.为啥整合 Dubbo 实现 SOA 二.运行 springboot-dubb ...
- 解析json方式之net.sf.json
前面转载了json解析的技术:fastjson,今天说下另外一种技术. 下载地址 本次使用版本:http://sourceforge.net/projects/json-lib/files/json- ...