java_reflect_01
最近学习java开始接触到了框架,突然觉得java反射很重要,因此在这里做了一些总结(参考园中大苞米大神的文章)
首先我们要认识一下Class:
一、Class类有什么用?
class类的实例表示java应用运行时的类(class ans enum)或接口(interface and annotation)(每个java类运行时都在JVM里表现为一个class对象,可通过类名.class,类型.getClass(),Class.forName("类名")等方法获取class对象)。数组同样也被映射为为class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本类型boolean,byte,char,short,int,long,float,double和关键字void同样表现为 class 对象。
二、Class类的特征
class类没有公有的构造方法,它由JVM自动调用(在new对象或者加载-classLoader时)
三、Class类是Reflection API中核心的类,他位于java.lang.Class
列出一些常用的方法。
- getClassLoader():返回该类的加载器
- forName(String className):返回与带有给定字符串名的类或接口相关联的 Class 对象
- getDeclaredAnnotations():返回直接存在于此元素上的所有注释
- getAnnotation(Class<A> annotationClass):如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。
- getAnnotations():返回此元素上存在的所有注释。
- getName() : 获得类的完整名字
- getFields() : 获得类的public类型的属性
- getDeclaredFields() : 获得类的所有属性
- getMethods() : 获得类的public类型的方法
- getDeclaredMethods() : 获得类的所有方法
- getMethod(String name, Class[] parameterTypes) : 获取类的特定方法(name参数指定方法名字,parameterTypes参数指定方法参数类型)
- getConstructors() : 获得类的public类型的构造方法
- getConstructor(Class[] parameterTypes) : 获得类的特定构造方法(parameterTypes参数指定构造方法的参数类型)
- newInstance() : 通过类的不带参数的构造方法创建这个类的一个对象
等等,具体可以参照API文档
初步知识了Class以后,我们看看
四、如何获取其对象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();
五、通过反射获取对象
创建一个PO类
package po;
public class User {
/**
* id
*/
private int id;
/**
* 年龄
*/
private int age;
/**
* 姓名
*/
private String name;
/**
*
*/
public User() {
super();
}
/**
* @param id
* @param name
* @param age
*/
public User(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
/**
* @return the age
*/
public int getAge() {
return age;
}
/**
* @return the id
*/
public int getId() {
return id;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param age the age to set
*/
public void setAge(int age) {
this.age = age;
}
/**
* @param id the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
大家都知道获得对象实例就是去new一个,其实就是调用对象的构造方法
这里将调用构造方法参数的不同分为两种类型:
a)调用无参数的构造方法:
1.调用Class对象的newInstance()方法:
@Test
public void test01() throws Exception{
Class<?> clazz=Class.forName("po.User");
User newInstance =(User)clazz.newInstance();
newInstance.setAge(24);
newInstance.setId(1001);
newInstance.setName("wangyang");
System.out.println(newInstance);
//User [id=1001, name=wangyang, age=24] }
2.调用Class对象的Constructor对象的newInstance()方法,传递一个空的Class对象数组作为参数:
@Test
public void test01() throws Exception{
Class<?> clazz=Class.forName("po.User");
Constructor user=clazz.getConstructor(null);
User u=(User) user.newInstance(null);
u.setAge(24);
u.setId(10);
u.setName("wangyang");
System.out.println(u);
//User [id=10, name=wangyang, age=24] }
b)调用有参数的构造方法:
调用Class对象的Constructor对象的newInstance()方法,传递一个可变长的Class对象数组作为参数
@Test
public void test01() throws Exception{
Class<?> clazz=Class.forName("po.User");
Constructor user=clazz.getConstructor(int.class,String.class,int.class);
Object newInstance = user.newInstance(24,"wangyang",24);
System.out.println(newInstance);
//User [id=24, name=wangyang, age=24]
}
3.再来试一试反射调用方法
@Test
public void test01() throws Exception{
Class<?> clazz=Class.forName("po.User");
Object newInstance = clazz.newInstance();
Method m=clazz.getMethod("setAge", int.class);
Method m2=clazz.getMethod("toString", null);
m.invoke(newInstance, 100);
System.out.println(m2.invoke(newInstance, null));
//User [id=0, name=null, age=100]
}
java_reflect_01的更多相关文章
随机推荐
- 一句话改变TGraphicControl控件的left坐标的前世今生
稍微用脑子想了一下,图形控件没有句柄,因此先把自己的坐标改一改,然后只要把父控件的某些区域Invalidate一下就可以了,WM_PAINT消息一来,父控件就会重绘所有子图形控件,就达到了相应的效果. ...
- Struts2之ajax初析
Web2.0的随波逐流,Ajax那是大放异彩,Struts2框架自己整合了对Ajax的原生支持(struts 2.1.7+,之前的版本可以通过插件实现),框架的整合只是使得JSON的创建变得异常简单, ...
- YII 主题
heming是一个在Web应用程序里定制网页外观的系统方式.通过采用一个新的主题,网页应用程序的整体外观可以立即和戏剧性的改变. 在Yii,每个主题由一个目录代表,包含view文件,layout文件和 ...
- Nodejs爬虫进阶教程之异步并发控制
Nodejs爬虫进阶教程之异步并发控制 之前写了个现在看来很不完美的小爬虫,很多地方没有处理好,比如说在知乎点开一个问题的时候,它的所有回答并不是全部加载好了的,当你拉到回答的尾部时,点击加载更多,回 ...
- hihoCoder 1392 War Chess 【模拟】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2016)网络赛)
#1392 : War Chess 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Rainbow loves to play kinds of War Chess gam ...
- 【单调队列】Vijos P1771 瑞士轮 (NOIP2011普及组第三题)
题目链接: https://vijos.org/p/1771 题目大意: 给定2N个人(N<=100 000)和其初始分数.能力值(能力两两不同),比赛M次(M<=50),每次PK都是按分 ...
- Jenkins 八: 构建Git项目
1. 安装git. http://git-scm.com/download/win 下载之后一步步安装即可. 2. 安装插件. 打开"系统管理" –> "管理插 ...
- Jenkins 二:邮件配置
默认邮件的配置 假设管理员邮箱是 user1@domain1.com,密码是pw1. 1. 打开“系统管理”-> “系统设置”. 2. 找到“Jenkins Location”-> “系统 ...
- S3C2440 I2C总线控制
概述:话不多说,直接上图 多主机IIC总线控制(IICCON): IIC控制总线状态(IICSTAT): IIC总线地址(IICADD): IIC发送,接收总线寄存器(IICDS) IIC总线控制寄存 ...
- LTTng调试: 一个系统软件工程师的随手涂鸦
http://nanxiao.me/install-lttng/ http://packages.efficios.com/ http://lttng.org/ http://lttng.org/do ...