菜鸟学Java(十五)——Java反射机制(二)
上一篇博文《菜鸟学编程(九)——Java反射机制(一)》里面,向大家介绍了什么是Java的反射机制,以及Java的反射机制有什么用。上一篇比较偏重理论,理论的东西给人讲出来总感觉虚无缥缈,还是结合一些实例比较形象具体。那么今天就结合更多的实例具体说说。
实例一:获得完整的类名
package reflection.getclassname; //获得完整的类名
public class GetClassName { public String getNameByClass() { String name = "";
System.out.println("通过类本身获得对象");
Class UserClass = this.getClass();
System.out.println("获得对象成功!\n"); System.out.println("通过类对象获得类名");
name = UserClass.getName();
System.out.println("获得类名成功!");
return name;
}
public static void main(String[] args) { GetClassName gcn = new GetClassName();
System.out.println("类名为:"+gcn.getNameByClass());
} }
运行结果:
|
通过类本身获得对象 通过类对象获得类名 |
实例二:获得类的属性
package reflection.getfields; import java.lang.reflect.Field; //获得类的属性
public class GetFields { public static void getFieldNames(String className) { try {
//获得类名
Class c = Class.forName(className);
//获得所有属性
Field[] fds = c.getFields(); for (int i=0; i<fds.length; i++)
{
String fn = fds[i].getName();
Class tc = fds[i].getType();
String ft = tc.getName();
System.out.println("该属性的名字为:"+fn+",该属性的类型为:"+ft);
}
}catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) {
GetFields.getFieldNames("reflection.getfields.FieldInfo");
} }
运行结果:
|
该属性的名字为:id,该属性的类型为:java.lang.String 该属性的名字为:username,该属性的类型为:java.lang.String |
实例三:获得类实现的接口
package reflection.getinterfaces; //获得类实现的接口
public class GetInterfaces { public static void getInterfaces(String className) {
try {
//取得类
Class cl = Class.forName(className);
Class[] ifs = cl.getInterfaces();
for (int i = 0; i<ifs.length;i++)
{
String IName = ifs[i].getName();
System.out.println("该类实现的接口名字为:"+IName);
}
}catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) {
GetInterfaces.getInterfaces("reflection.getinterfaces.Student");
} }
运行结果:
|
该类实现的接口名字为:reflection.getinterfaces.Person |
实例四:获得类及其属性的修饰符
package reflection.getmodifiers; import java.lang.reflect.Field;
import java.lang.reflect.Modifier; import reflection.UserInfo; //获得类及其属性的修饰符
public class GetModifiers { private String username = "liu shui jing";
float f = Float.parseFloat("1.000");
public static final int i = 37; //获得类的修饰符
public static String useModifiers(UserInfo ui) { Class uiClass = ui.getClass();
int m = uiClass.getModifiers();
return Modifier.toString(m); } //获得本类属性的修饰符
public void checkThisClassModifiers() { Class tc = this.getClass();
Field fl[] = tc.getDeclaredFields(); for(int i=0;i<fl.length;i++)
{
System.out.println("第"+(i+1)+"个属性的修饰符为:"+Modifier.toString(fl[i].getModifiers()));
} }
public static void main(String[] args) { //获得类的修饰符
UserInfo ui =new UserInfo();
System.out.println("获得这个类的修饰符:"+GetModifiers.useModifiers(ui)+"\n"); //获得本类属性的修饰符
GetModifiers gm = new GetModifiers();
gm.checkThisClassModifiers(); } }
运行结果:
|
获得这个类的修饰符:public 第1个属性的修饰符为:private 第2个属性的修饰符为: 第3个属性的修饰符为:public static final |
实例五:获得类的构造函数
package reflection.getconstructor; import java.lang.reflect.Constructor; //获得类的构造函数
public class GetConstructor { //构造函数一
GetConstructor(int a) { } //构造函数二
GetConstructor(int a, String b) { } public static void getConstructorInfo(String className) {
try {
//获得类的对象
Class cl =Class.forName(className);
System.out.println("获得类"+className+"所有的构造函数");
Constructor ctorlist[] = cl.getDeclaredConstructors();
System.out.println("遍历构造函数\n");
for(int i =0 ; i<ctorlist.length; i++)
{
Constructor con = ctorlist[i];
System.out.println("这个构造函数的名字为:"+con.getName());
System.out.println("通过构造函数获得这个类的名字为:"+con.getDeclaringClass()); Class cp[] = con.getParameterTypes();
for (int j=0; j<cp.length; j++)
{
System.out.println("参数 "+j+" 为 "+cp[j]+"\n");
}
}
}catch (Exception e) {
System.err.println(e);
}
}
public static void main(String[] args) {
GetConstructor.getConstructorInfo("reflection.getconstructor.GetConstructor");
} }
运行结果:
|
获得类reflection.getconstructor.GetConstructor所有的构造函数 遍历构造函数 这个构造函数的名字为:reflection.getconstructor.GetConstructor 通过构造函数获得这个类的名字为:class reflection.getconstructor.GetConstructor 参数 0 为 int 这个构造函数的名字为:reflection.getconstructor.GetConstructor 通过构造函数获得这个类的名字为:class reflection.getconstructor.GetConstructor 参数 0 为 int 参数 1 为 class java.lang.String |
实例六:获得父类
package reflection.getparentclass; //获得父类
public class GetParentClass { public static String getParentClass(UserInfoMore uim) { //获得父类
Class uimc = uim.getClass().getSuperclass();
System.out.println("获得父类的名字为:"+uimc.getName());
return uimc.getName(); } public static void searchParentClass() { } public static void main(String[] args) { UserInfoMore uim = new UserInfoMore();
System.out.println("成功获得UserInfoMore的父类:"+GetParentClass.getParentClass(uim)); } }
运行结果:
|
获得父类的名字为:reflection.UserInfo 成功获得UserInfoMore的父类:reflection.UserInfo |
实例七:获得类的方法
package reflection.getmethod; import java.lang.reflect.Method; //获得类的方法
public class GetMethod { public static void getMethods(String className) {
try {
System.out.println("开始遍历类"+className+".class");
//获得类名
Class cls = Class.forName(className);
//利用方法获得所有该类的方法
System.out.println("利用类的getDeclaredMethods获得类的所有方法");
Method ml[] =cls.getDeclaredMethods();
System.out.println("遍历获得的方法数组\n");
for (int i = 0 ;i<ml.length;i++)
{
System.out.println("开始遍历第"+(i+1)+"个方法");
Method m = ml[i];
System.out.println("开始获取方法的变量类型");
Class ptype[] = m.getParameterTypes();
for (int j=0; j<ptype.length; j++)
{
System.out.println("方法参数"+j+"类型为"+ptype[j]);
}
Class gEx[] = m.getExceptionTypes();
for (int j=0 ; j<gEx.length; j++)
{
System.out.println("异常"+j+"为"+ gEx[j]);
} System.out.println("该方法的返回值类型为:"+m.getReturnType()+"\n"); }
}catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) {
GetMethod.getMethods("reflection.UserInfo");
} }
运行结果:
|
开始遍历类reflection.UserInfo.class 利用类的getDeclaredMethods获得类的所有方法 遍历获得的方法数组 开始遍历第1个方法 开始获取方法的变量类型 该方法的返回值类型为:class java.lang.String 开始遍历第2个方法 开始获取方法的变量类型 该方法的返回值类型为:class java.lang.Integer 开始遍历第3个方法 开始获取方法的变量类型 方法参数0类型为class java.lang.String 该方法的返回值类型为:void 开始遍历第4个方法 开始获取方法的变量类型 该方法的返回值类型为:class java.lang.String 开始遍历第5个方法 开始获取方法的变量类型 方法参数0类型为class java.lang.Integer 该方法的返回值类型为:void 开始遍历第6个方法 开始获取方法的变量类型 该方法的返回值类型为:class java.lang.String 开始遍历第7个方法 开始获取方法的变量类型 方法参数0类型为class java.lang.String 该方法的返回值类型为:void |
这次实例不少吧,而且这些小例子都比较简单,相信大家都可以轻松秒懂。上面一些例子的代码并不是完整的,有些只有一些关键代码,如果想要完整的代码请戳下面的链接。最后祝大家学习愉快!
菜鸟学Java(十五)——Java反射机制(二)的更多相关文章
- JAVA(五)反射机制/Annotation
成鹏致远 | lcw.cnblog.com |2014-02-04 反射机制 1.认识Class类 在正常情况下,必须知道一个类的完整路径之后才可以实例化对象,但是在 java中也允许通过一个对象来找 ...
- Java从零开始学三十五(JAVA IO- 字节流)
一.字节流 FileOutputStream是OutputStream 的直接子类 FileInputStream也是InputStream的直接子类 二.文本文件的读写 2.1.字节输入流 Test ...
- Java进阶(二十五)Java连接mysql数据库(底层实现)
Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜 ...
- Java进阶(三十五)java int与integer的区别
Java进阶(三十五)java int与Integer的区别 前言 int与Integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而Integer是对象 ...
- Java 核心类库之反射机制
1:什么是反射机制? 2:反射机制它可以做什么呢? 3:反射机制对应的API又是什么? 1):通过反射机制来获取一个对象的全限定名称(完整包名),和类名: 2):实例化Class对象 3):获取对象的 ...
- java十五个常用类学习及方法举例
<code class="language-java">import java.util.Scanner; import java.util.Properties; i ...
- Java从零开始学四十五(Socket编程基础)
一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...
- JAVA学习第六十四课 — 反射机制
Java反射机制是在执行状态中,对于随意一个类,都可以知道这个类的全部属性和方法,对于随意一个对象,都可以调用它的随意一个方法和属性,这样的动态获取的信息以及动态调用对象的方法的功能称为java ...
- 在JAVA中,关于反射机制的讨论
一.什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制 ...
- Java进阶之reflection(反射机制)——反射概念与基础
反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...
随机推荐
- django之创建第4-3个项目-访问list数据
1.index <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- java 增量运算符
//java 增量运算符 public class Test16{ public static void main(String args[]) { int x1=10; x1+=3; //x1=x1 ...
- 菜鸟云打印接入Demo
菜鸟云打印接入Demo 0. 接入流程图 1. 连接打印客户端 首先要打开打印客户端,然后使用下面的方法,连接客户端(WebSocket协议): 地址 : 连接打印客户端 function doCo ...
- Ubuntu16.04 安装使用KiCad
KiCad是一个带模拟器的电路设计软件, 官网 http://kicad-pcb.org/, 当前版本是4.0.7 安装 参考http://kicad-pcb.org/download/ubuntu/ ...
- WinForm中 事件 委托 多线程的应用【以一个下载进度条为例】
第一步:首先我们创建一个winfor的项目 第二步:我们建一个窗体 在一个窗体里面 打开一个另外的窗体 另外的窗体有一个按钮 点击后就开始下载 下载完成后 在注册窗体上面 显示下载完成(达到在一个窗体 ...
- Mysql模糊查询 select count(*) from sys_invitation where from_id like '%1006%';
select count(*) from sys_invitation where from_id like '%1006%'; 查询结果 select * from sys_invitation w ...
- Spring 3.0 AOP 之 AOP 术语 (一)
关于AOP.之前我已写过一个系列的随笔: <自己实现简单的AOP>,它的关注点在于实现.实现语言是C#,实现方式为 自定义实现 RealProxy 抽象类.重写Invoke方法,以便进行方 ...
- 要成为linux网站运维工程师必须要掌握的技能
要成为linux网站运维工程师必须要掌握的技能 2015-07-27 发表 老男孩点评:感谢此文的作者,写的非常到位,值得入门的初学者认真看看 我是一名linux运维工程师,确切的说是网站运维工程师, ...
- bootstrap-datepicker限定可选时间范围
此项目是 bootstrap-datetimepicker 项目 的一个分支,原项目不支持 Time 选择. 其它部分也进行了改进.增强,例如 load 过程增加了对 ISO-8601 日期格式的支 ...
- Linux命令-进程后台执行:nohup(就是不挂起的意思)
nohup 就是不挂起的意思( no hang up) 用途:LINUX命令用法,不挂断地运行命令. 语法: nohup Command [ Arg ... ] [ & ] 描述:nohup ...