菜鸟学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动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...
随机推荐
- Dubbo在开发中的一些常用配置
介绍Dubbo在开发中的一些常用配置,文中内容主要参考dubbo文档配置和示例两节,详细可移步访问 传送站 1. 属性配置方法及加载顺序 属性常用配置方法主要有三种: 第一种是通过启动时在虚拟机参数 ...
- Web-URL编码流程图(详细了解乱码原因)
URL编码流程图 原URL---->GET时浏览器根据HTTP头的Content-Type的charset,POST根据(<meta http-equiv="Content-Ty ...
- android开发学习---基础知识学习、如何导入已有项目和开发一个电话拨号器
一.基础知识点学习 1.Android体系结构 如图所示,android 架构分为三层: (1)最底层是linux内核,主要是各种硬件的驱动,如相机驱动(Camera Driver),闪存驱动(Fl ...
- RHEL/CentOS 7.x/6.x/5.x开启EPEL仓库
说明 原文链接 翻译:@adolphlwq 项目地址 这篇指南文章教你如何在 RHEL/CentOS 7.x/6.x/5.x 系统中开启EPEL仓库支持,以便你可以使用 yum 命令 安装额外的标准开 ...
- 如果没有 Android 世界会是什么样子?
2005年谷歌从安迪·鲁宾(Andy Rubin)手中收购Android系统,起初安迪·鲁宾(Andy Rubin)只是想为数码相机开发出一个更为先进的系统,所以有了 Android.但是智能手机行业 ...
- [Android实例] Android之断点续传下载
在我们做开发的时候经常遇到的就是下载了,现在下载的方法有很多很多,那么怎么做到断点续传下载呢!很多人都头疼这个问题,如果我们没有很好的逻辑真不是很容易解决啊.我参考了一下前辈们的资料了整理了一个项目, ...
- 【代码导读】Github 开源项目——wysihtml5 富编辑器(Bootstrap 风格)【一】
如果你经常留迹于各大论坛.博客,肯定对它们的富编辑器稍有印象.纯 Javascript 富编辑器可以说是前台 JS 脚本的巅峰作品.一款完整的编辑器,其复杂的功能,会让你遇到各种头痛的浏览器兼容问题, ...
- 【Spring】SpringMVC之上传文件
这里笔者介绍利用SpringMVC上传图片的操作. 步骤 1. 引入jar文件 不仅需要导入开发SpringMVC相关的包,还需要导入 commons-fileupload-1.2.1.jar 和 ...
- 【Linux】统计命令wc
如果我想要知道 /etc/man.config 这个文件里面有多少字?多少行?多少字符的话, 可以怎么做呢?其实可以利用 wc 这个命令来达成喔!他可以帮我们计算输出的信息的整体数据! [root@w ...
- python学习笔记——提取网页信息BeautifulSoup4
1 BeautifulSoup概述 beautifulSoup是勇python语言编写的一个HTML/XML的解析器,它可以很好地处理不规范标记并将其生成剖析树(parse tree): 它提供简单而 ...