Java反射机制的简单学习
今天看了一下Java的反射机制,就此记录一下。
首先,我们要先了解一下什么是反射?
- 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。
- JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制
Java反射的应用
- Spring框架
- Hibernate框架:关联映射等
- 白盒测试
Java反射相关API
java.lang包下
-Class<T>:表示一个正在运行的 Java 应用程序中的类和接口,是Reflection的起源
java.lang.reflect包下
-Field 类:代表类的成员变量(也称类的属性)
-Method 类 : 代表类的方法
-Array 类 : 提供了动态创建数组,以及访问数组的元素的静态方法
反射的类类型:Class
假设我们有一个Role类
package _Venom_.reflection;
public class Role {
private String name;
private String type;
//Constructors
public Role(){
System.out.println("Constructor Role() is invoking!");
}
private Role(String _name){
this.name = _name;
System.out.println("Constructor Role(String _name) is invoking!");
}
//get and set method
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
//override the toString method to show the class
@Override
public String toString() {
// TODO Auto-generated method stub
return "This is a role called " + this.name;
}
}
我们可以通过以下方式得到类类型。
|
获取方式 |
说明 |
示例 |
|
object.getClass() 每个对象都有此方法 |
获取指定实例对象的Class |
List list = new ArrayList(); Class listClass = list.getClass(); |
|
class. getSuperclass() |
获取当前Class的继承类Class |
List list = new ArrayList(); Class listClass = list.getClass(); Class superClass = listClass. getSuperclass(); |
|
Object.class |
.class直接获取 |
Class listClass = ArrayList.class; |
|
Class.forName(类名) |
用Class的静态方法,传入类的全称即可 |
try { Class c = Class.forName("java.util.ArrayList"); } catch (ClassNotFoundException e) { e.printStackTrace(); } |
|
Primitive.TYPE |
基本数据类型的封装类获取Class的方式 |
Class longClass = Long.TYPE; Class integerClass = Integer.TYPE; Class voidClass = Void.TYPE; |
Class class1 = Role.class;
try {
Class class2 = Class.forName("_Venom_.reflection.Role");
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
通过类类型的newInstance方法来创建一个实例。如下
Object obj = class1.newInstance();
但是,我们通常的做法是通过Constructor类来获取类的构造方法,然后再通过Constructor类的newInstance方法来创建实例。
获取类的构造器
Constructor类:
- public Constructor<?>[] getConstructor() 返回类中的所有public构造器集合,默认构造器的下标为0
- public Constructor<T> getConstructor(Class<?>...parameterTypes) 返回指定的public构造器,参数为构造器参数类型集合
- public Constructor<?>[] getDeclaredConstructor() 返回类中所有的构造器,包括私有
- public Constructor<T> getDeclaredConstructor(Class<?>...parameterTypes) 返回任意指定的构造器
Class class1 = Role.class;
try {
Class class2 = Class.forName("_Venom_.reflection.Role");
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} /**
* 获取构造方法Constructor
* getConstructor() only for public
* getDeclaredConstructor() global access all
* */
Constructor constructor = null;
//指定参数列表获取特定的方法
try {
//1
constructor = class1.getDeclaredConstructor(new Class[]{String.class});
//设置可访问的权限 不设置会报IllegalAccessException异常
constructor.setAccessible(true); } catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} Object obj = null;
try {
obj = constructor.newInstance(new Object[]{"Venom"});
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//打印对象的信息
System.out.println(obj); //2获取所有的构造方法的集合
Constructor constructorArr[] = null;
constructorArr = class1.getDeclaredConstructors();
constructorArr[1].setAccessible(true);
Object obj1 = null;
try {
obj1 = constructorArr[1].newInstance(new Object[]{"_Venom_"});
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(obj1);
在获取类的方法的时候,我们可以使用Method类:
总结:
感觉今天学习的Java反射机制还是很有用出的,以此Mark一下我的学习历程。
Java反射机制的简单学习的更多相关文章
- java反射机制的简单介绍
参考博客: https://blog.csdn.net/mlc1218559742/article/details/52754310 先给出反射机制中常用的几个方法: Class.forName (& ...
- (转)java反射机制及简单工厂模式
第一步,定义一个接口类 package factory.face; /** * 接口,为了保证返回的对象可以统一用 Product接受 * @author Administrator */ publi ...
- java反射机制的简单使用
java 反射机制 反射机制简介 参考地址 什么是反射机制 反射机制指程序在运行时能够获取自身的信息.在java中只要给定类的名字,就可以通过反射机制获得类的所有信息 反射机制的优缺点 首先了解一下动 ...
- 利用Java反射机制优化简单工厂设计模式
之前项目有个需求,审批流程的时候要根据配置发送信息:发送短信.发送邮件.当时看到这个就想到要用工厂模式,为什么要用工厂模式呢?用工厂模式进行大型项目的开发,可以很好的进行项目并行开发.就是一个程序员和 ...
- Java反射机制的简单应用
一直感觉java的反射机制非常强大,可是可用的地方不多.在android学习的时候.一直想实现挂断电话的功能,可是系统并没有提供开放的api接口,看了一下网上使用反射机制来实现该功能,确实非常强大,非 ...
- Java -- 浅入Java反射机制
1,Java 反射是Java语言的一个很重要的特征,它使得Java具体了"动态性". Java 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类. 在运行时构造任意一 ...
- 理解Java反射机制
理解Java反射机制 转载请注明出处,谢谢! 一.Java反射简介 什么是反射? Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在.灵活掌握Java反射机制,对学习框架技术有很大 ...
- Java反射机制的学习
Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调 ...
- JAVA反射机制—学习总结
最近收到很多关于Java反射机制的问题留言,其实Java反射机制技术方面没有太多难点,或许是大家在学习过程中遗漏了细小知识点,导致一些问题无法彻底理解,现在我们简单的总结一下,加深印象.什么是反射机制 ...
随机推荐
- Ubuntu 14.04 安装gstreamer0.10-ffmpeg
sudo apt-add-repository ppa:mc3man/trusty-media sudo apt-get update sudo apt-get install -y gstreame ...
- ZOJ 3537 Cake 求凸包 区间DP
题意:给出一些点表示多边形顶点的位置(如果多边形是凹多边形就不能切),切多边形时每次只能在顶点和顶点间切,每切一次都有相应的代价.现在已经给出计算代价的公式,问把多边形切成最多个不相交三角形的最小代价 ...
- 需要重刷整個 image 的時機 - 1
最近遇到一個問題, gpio 讀出來的值與預期不同, 詳細描述如下: 首先手機 download 了一個完整的 daily build image , 接下來 不斷地修改 kernel 部分 code ...
- Git 常用命令速查表(图文+表格)【转】
转自:http://www.jb51.net/article/55442.htm 一. Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态 git comm ...
- c#中char、string转换为十六进制byte的浅析
问题引出: string转换为byte(十六进制) static void Main(string[] args) { "; byte[] b = Encoding.Default.GetB ...
- 微信小程序时钟(xx年xx月xx日xx:xx格式)
wxml: <view>时间:{{newTime}}</view> js: page({ data:{ newTime:'' }, onLoad: function (opti ...
- Shell三剑客之sed命令
Sed简介 Sed是Stream Editor(流编辑器)缩写,是操作.过滤和转换文本内容的强大工具,常用功能有增删改查. Sed命令执行流程 Sed语法格式 Sed [option] ‘[匹配][处 ...
- Android端与Android端利用WIFI进行FTP通信
一.客户端通信工具类: import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; im ...
- HIbernate学习笔记5 之 查询
一.HQL查询 * 按条件查询,条件中写的是属性名,之后在query对象为添加赋值,如: String hql = " from User where uid=?"; Sessio ...
- Sql 中取小数点后面两位小数
,),round(UnTaxAmount,))as UnTaxAmount from View_SaleVoice ,)) as UnTaxAmount from View_SaleVoice