上一篇博文《菜鸟学编程(九)——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反射实例源码,具体讲解内容见博客http://blog.csdn.net/liushuijinger 菜鸟学编程(九)——Java反射机制(一) 菜鸟学编程(十)——Java反射机制(二)
菜鸟成长手册2009——CPU-内存-硬盘篇 - 硬件知识精华菜鸟成长手册2009——CPU-内存-硬盘篇 - 硬件知识精华菜鸟成长手册2009——CPU-内存-硬盘篇 - 硬件知识精华菜鸟成长手册2009——CPU-内存-硬盘篇 - 硬件知识精华...
这是我自己地java反射机制的总结,在学习饿过程中自己的看法,以及学习的记录,希望能够帮助到大家!
电子版的Python GUI设计之Tkinter菜鸟编程,一般是扫描图片组成的PDF或网页版 ,不支持查找操作,特整理成Word版并分享。
一个在黑客界引起轰动的菜鸟教材---跟我学编程系列
个人总结,集10年开发经验,精挑细选!不要错过哦。非常经典,非常实在的资料.轻松上手,附上经典实例,
菜鸟学习ARM——安装交叉编译链记录,及编译jpeg
菜鸟也玩LINUX——brk()漏洞重提.pdf
JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的...
菜鸟学习Java一(Java基础)
java菜鸟学习第一步-java基础语法,学习一门语言先从语法开始学起,学好基础才能深入的学习编程
菜鸟构建个人网站——“纯真年代”建站全过程(五).pdf
这个编程规范很不错,让你知道书上的程序和网上的程序的那些编排,变量的定义为什么是这样定义,因为你不知道在程序界有他们共同的规定,当你了解了这篇文章你的程序会突飞猛进,会让别人一看就是专业人员写出来的...
java学习进阶之路,如果从一个菜鸟进阶成大神(csdn)————程序
从原理讲解反射技术,及其作用,是不可多得的上手教程
菜鸟学习JAVA简单入门到精通,可以帮助刚入门的程序猿快速学习进入公司需要的技能
何勤老师的最新著作,编程原理,编程思路讲得很好.
运用Java和SQL设计管理系统,对于初学java的人来说,是很好的资料,里面包括源代码
让你从菜鸟变大师的必备装备! Windows游戏编程大师技巧——2D和3D游戏编程基础 绝对经典!值得一看!
php程序员菜鸟成长手记——php入门教程