上一篇博文《菜鸟学编程(九)——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());
} }

运行结果:

通过类本身获得对象
获得对象成功!

通过类对象获得类名
获得类名成功!
类名为:reflection.getclassname.GetClass Name

实例二:获得类的属性

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反射机制(二)的更多相关文章

  1. JAVA(五)反射机制/Annotation

    成鹏致远 | lcw.cnblog.com |2014-02-04 反射机制 1.认识Class类 在正常情况下,必须知道一个类的完整路径之后才可以实例化对象,但是在 java中也允许通过一个对象来找 ...

  2. Java从零开始学三十五(JAVA IO- 字节流)

    一.字节流 FileOutputStream是OutputStream 的直接子类 FileInputStream也是InputStream的直接子类 二.文本文件的读写 2.1.字节输入流 Test ...

  3. Java进阶(二十五)Java连接mysql数据库(底层实现)

    Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜 ...

  4. Java进阶(三十五)java int与integer的区别

    Java进阶(三十五)java int与Integer的区别 前言 int与Integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而Integer是对象 ...

  5. Java 核心类库之反射机制

    1:什么是反射机制? 2:反射机制它可以做什么呢? 3:反射机制对应的API又是什么? 1):通过反射机制来获取一个对象的全限定名称(完整包名),和类名: 2):实例化Class对象 3):获取对象的 ...

  6. java十五个常用类学习及方法举例

    <code class="language-java">import java.util.Scanner; import java.util.Properties; i ...

  7. Java从零开始学四十五(Socket编程基础)

    一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...

  8. JAVA学习第六十四课 — 反射机制

       Java反射机制是在执行状态中,对于随意一个类,都可以知道这个类的全部属性和方法,对于随意一个对象,都可以调用它的随意一个方法和属性,这样的动态获取的信息以及动态调用对象的方法的功能称为java ...

  9. 在JAVA中,关于反射机制的讨论

    一.什么是反射机制         简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,     那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制 ...

  10. Java进阶之reflection(反射机制)——反射概念与基础

    反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...

随机推荐

  1. WinHttp编写HTTP服务器示例代码

    这是微软提供的示例程序,原文地址在此https://msdn.microsoft.com/en-us/library/windows/desktop/aa364640(v=vs.85).aspx HT ...

  2. MFQ

    一什么是MFQ&PPDCS?MFQ&PPDCS是由外部教练邰晓梅提出的一套测试分析和测试设计方法.MFQ将被测对象分层,针对不同层次进行测试分析和设计进行,使测试设计人员不会那么容易忘 ...

  3. Retrofit三步理解之中的一个 ------------------ Retrofit的简单使用总结

    概念: Retrofit一開始看起来使用比較麻烦是由于它和其它网络请求框架不同的是它是通过注解和interface来进行网络请求,而且须要对返回数据进行特殊处理才干使用. 1. 简单使用,请求返回St ...

  4. C#实现多文件上传,写到文件夹中,获取文件信息以及下载文件和删除文件

    前台:.js //上传附件 function uploadAttachment() { if ($("#Tipbind").attr('checked')) { var ip = ...

  5. ios中VRGCalendarView日历控件

    http://pan.baidu.com/share/link?shareid=4166002480&uk=923776187 官网 https://github.com/TjeerdVuri ...

  6. hibernate实现多表联合查询

    转自:http://blog.sina.com.cn/s/blog_67b9ad8d01010by1.html 以前用sql实现联合查询 是非常简单的事,只需要写sql语句就可以,第一次遇到hiber ...

  7. JSP、Servlet中的相对路径和绝对路径 页面跳转问题

    转自:http://blog.csdn.net/wym19830218/article/details/5503533/ 1.JSP.Servlet中的相对路径和绝对路径 前提:假设你的Http地址为 ...

  8. Using Repository Pattern in Entity Framework

    One of the most common pattern is followed in the world of Entity Framework is “Repository Pattern”. ...

  9. VS2017 IDE开发工具选型、安装和使用

    原文地址:https://blog.csdn.net/boonya/article/details/78739500 距离上次使用VS工具已是2年前了,这次准备选择比较新的版本来开发桌面程序了.总的来 ...

  10. Windows键盘消息处理

    原文链接: http://blog.sina.com.cn/s/blog_5f8817250100taab.html 本文大部分来自MSDN和网友的博客,我在实践的基础上再作了一些总结. 1,虚拟键( ...