Java反射学习总结一(基础篇)
Class类是Reflection API中核心的类,他位于Java.lang.Class
列出一些常用的方法。
- getName() : 获得类的完整名字
- getFields() : 获得类的public类型的属性
- getDeclaredFields() : 获得类的所有属性
- getMethods() : 获得类的public类型的方法
- getDeclaredMethods() : 获得类的所有方法
- getMethod(String name, Class[] parameterTypes) : 获取类的特定方法(name参数指定方法名字,parameterTypes参数指定方法参数类型)
- getConstructors() : 获得类的public类型的构造方法
- getConstructor(Class[] parameterTypes) : 获得类的特定构造方法(parameterTypes参数指定构造方法的参数类型)
- newInstance() : 通过类的不带参数的构造方法创建这个类的一个对象
如果想使用反射,有2个关键的部分
1.获取Class对象
2.获得对象实例
下面来介绍这两个部分:
1.如何获取Class对象
获取某个类或某个对象所对应的Class对象的常用的3种方法
a) 使用Class类的静态方法forName:
Class.forName("java.lang.String");
b) 使用类的.class语法:
String.class;
c) 使用对象的getClass()方法(java.lang.Object类中的方法):
String s = "aa";
Class<?> clazz = s.getClass();
2.如何获得对象实例
大家都知道获得对象实例就是去new一个,其实就是调用对象的构造方法
这里将调用构造方法参数的不同分为两种类型:
a)调用无参数的构造方法:
1.调用Class对象的newInstance()方法:
Class<?> classType = ClassClass.forName("java.lang.String");
Object object = classTpye.newInstance();
2.调用Class对象的Constructor对象的newInstance()方法,传递一个空的Class对象数组作为参数:
Class<?> classType = ClassClass.forName("java.lang.String");
Constructor cons = classType.getConstructor(new Class[]{});
Object object =cons.newInstance(new Object[]{});
b)调用有参数的构造方法:
1.调用Class对象的Constructor对象的newInstance()方法,传递一个可变长的Class对象数组作为参数,本例传递String,int两个参数:
Class<?> classType = ClassClass.forName("java.lang.String");
Constructor cons = classType.getConstructor(new Class[]{String.class, int.class});
Object object =
cons.newInstance(new Object[]{"hello",3});
下面来一个小Demo,由于过于简单这里就只贴代码了
这个demo简单的实现了上面介绍的一些关于反射的用法,算是一个复习巩固:
- class Person {
- private long id;
- private int age;
- private String name;
- public Person() {
- }
- public Person(String name, int age) {
- this.name = name;
- this.age = age;
- }
- @Override
- public String toString() {
- return "Name="+getName()+" Age="+getAge()+" Id="+getId();
- }
- public long getId() {
- return id;
- }
- public void setId(long id) {
- this.id = id;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
很简单的一个自定义类,两个构造方法,和一些get,set方法,还有一个重写的toString
下面是调用反射的main方法中的代码,主要就是用反射的方法调用Person的带参构造方法给age,name赋值,在调用setId给id赋值,最后调用toString方法打印出结果
- public static void main(String[] args) throws Exception {
- //获取Person类的Class对象
- Class<?> classType = Class.forName("Person");
- //调用Person类的两个参数构造方法生成对象
- Constructor constructor = classType.getConstructor(new Class[]{String.class, int.class});
- Object object = constructor.newInstance(new Object[]{"Dean",25});
- //获取setId方法
- Method setId = classType.getMethod("setId", new Class[]{long.class});
- //调用setId方法设置Id
- setId.invoke(object, new Object[]{10});
- //调用toString输出结果
- Method toString = classType.getMethod("toString", new Class[]{});
- String result = (String) toString.invoke(object, new Object[]{});
- System.out.println(result);
- }
输出结果为:Name=Dean Age=25 Id=10
最近正在看反射的视频和资料,写这个博文的目的就是对于学习的一个总结吧。
陆续可能会更新一些我总结的更深层的反射知识,希望大家支持
Java反射学习总结一(基础篇)的更多相关文章
- 深入解析Java反射(1) - 基础
深入解析Java反射(1) - 基础 最近正筹备Samsara框架的开发,而其中的IOC部分非常依靠反射,因此趁这个机会来总结一下关于Java反射的一些知识.本篇为基本篇,基于JDK 1.8. 一.回 ...
- Spark学习体系整理(基础篇、中级篇、高级篇所涉及内容)
新手刚开始学习比较迷茫,参考下面,然后找相关资料学习 1 Spark基础篇 1.1 Spark生态和安装部署 在安装过程中,理解其基本操作步骤. 安装部署 ...
- Java反射学习总结终(使用反射和注解模拟JUnit单元测试框架)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 本文是Java反射学习总结系列的最后一篇了,这里贴出之前文章的链接,有兴趣的可以打开看看. ...
- Java反射学习总结四(动态代理使用实例和内部原理解析)
通过上一篇文章介绍的静态代理Java反射学习总结三(静态代理)中,大家可以发现在静态代理中每一个代理类只能为一个接口服务,这样一来必然会产生过多的代理,而且对于每个实例,如果需要添加不同代理就要去添加 ...
- 夯实Java基础系列1:Java面向对象三大特性(基础篇)
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 [https://github.com/h2pl/Java-Tutorial](https: ...
- Java工程师学习指南(中级篇)
Java工程师学习指南 中级篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我写的文章都是站 ...
- Python学习笔记之基础篇(-)python介绍与安装
Python学习笔记之基础篇(-)初识python Python的理念:崇尚优美.清晰.简单,是一个优秀并广泛使用的语言. python的历史: 1989年,为了打发圣诞节假期,作者Guido开始写P ...
- Django学习笔记(基础篇)
Django学习笔记(基础篇):http://www.cnblogs.com/wupeiqi/articles/5237704.html
- Java反射学习系列-绪论
Java反射学习系列-绪论 https://blog.csdn.net/hanchao5272/article/details/79358924
- Java工程师学习指南(入门篇)
Java工程师学习指南 入门篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我之前写的文章都 ...
随机推荐
- 上市公司恋上互联网金融 目前已有14家涌入P2P
时至今日,互联网金融已蔚然成风,诸多上市公司正前赴后继介入到P2P业务中,据记者初步统计,目前至少有14家A股上市公司参与了P2P业务.央行6月份的报告显示,中国当前有600多家P2P公司,交易额达到 ...
- 「HAOI2016」字符合并
「HAOI2016」字符合并 题意: 有一个长度为\(n\)的\(01\)串,你可以每次将相邻的\(k\)个字符合并,得到一个新的字符并获得一定分数.得到的新字符和分数由这\(k\)个字符确定.你 ...
- cat---查看文件内容
- 【习题 8-8 UVA - 1612】Guess
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] double千万不要用==判断相等... 而且两个保留2位有效数字的数字x,y 判断它们相等应该这样. int temp1 = ro ...
- 【Codeforces Round #427 (Div. 2) C】Star sky
[Link]:http://codeforces.com/contest/835/problem/C [Description] 给你n个星星的坐标(xi,yi); 第i个星星在第t秒,闪烁值变为(s ...
- Css学习总结(1)——20个很有用的CSS技巧
1. 黑白图像 这段代码会让你的彩色照片显示为黑白照片,是不是很酷? img.desaturate { filter: grayscale(100%); -webkit-filter: graysca ...
- JDBC连接池C3P0
连接池 1)传统方式找DriverManager要连接.数目是有限的. 2)传统方式的close().并没有将Connection重用.仅仅是切断应用程序和数据库的桥梁,即无发送到SQL命令到数据库端 ...
- Android图片处理——压缩、剪裁、圆角、保存
点击查看原文 项目中用到的关于图片的处理 public class UtilPicture { public static final String IMAGE_UNSPECIFIED = " ...
- 将bat批处理命令文件固定到任务栏
将bat批处理命令文件固定到任务栏第一种方法:使用链接工具http://www.xstui.com/read/3451.在任务栏点击右键,移动到工具栏,勾选链接工具2.你会在通知栏左侧看到链接字样,将 ...
- .Net Standard和各平台关系
.NET Standard 1.0 1.1 1.2 1.3 1.4 1.5 1.6 2.0 .NET 核心 1.0 1.0 1.0 1.0 1.0 1 ...