最近继续回顾Java基础,进行到了Java反射这一部分,个人感觉这部分应该算是Java的高级特性了,在日常开发中使用的并不多,应用人员主要是工具构建人员,所以这次学习中以了解为主,Java反射主要应用在工具型项目的开发中,例如Spring。

  在程序运行期间,JRE会为所有的对象创建一个类型标识,保存这些信息的类就是Class类,反射所有的功能都是围绕这个类来实现的,获取方法有以下几种:

    1.new Date().getClass();

    2.Date.class;

    3.Class.forName(java.util.Date)

  基础方法如下(更多方法请查看API):

    1.Class.getName()    返回类名

    2.Class.newInstance()  根据Class对象创建实例

    3.Class.getDeclaredFields()    获取类的属性数组

    4.Class.getDeclaredMethods()   获取类的方法数组

    5.Class.getDeclaredConstructors()  获取类的构造器数组

    6.Field/Method/Constructor.getModifiers()  获取属性/方法/构造器的修饰符

  下面附上一个解析类的DEMO,运行结果如下:

    

  代码如下:

  

package com.demo.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner; /**
* Java反射获取类内容
* @author liweitao
*
*/
public class PrintClass { public static void main(String[] args) { Scanner scanner = new Scanner(System.in);
System.out.println("enter a class name");
String name = scanner.nextLine(); try {
Class cls = Class.forName(name);
String modifier = Modifier.toString(cls.getModifiers());
Class superCls = cls.getSuperclass();
Class[] interCls = cls.getInterfaces(); System.out.print(modifier +" class " + name); if(superCls != null && superCls != Object.class){
System.out.print(" extends " + superCls.getName());
} for(int i = 0; i < interCls.length; i++){
if(i == 0){
System.out.print(" implements ");
}else if(i > 0){
System.out.print(",");
}
System.out.print(interCls[i].getName());
}
System.out.println("{");
printFields(cls);
printConstructors(cls);
printMethods(cls);
System.out.print("}");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} } /**
* 打印字段
* @param cls
*/
public static void printFields(Class cls){
Field[] fields = cls.getDeclaredFields();
for(Field field : fields){
StringBuffer result = new StringBuffer();
Class type = field.getType();
String name = field.getName();
String modifiers = Modifier.toString(field.getModifiers());
if(modifiers.length() > 0){
result.append("\t").append(modifiers).append(" ")
.append(type.getName()).append(" ").append(name);
}
System.out.println(result.toString());
}
} /**
* 打印构造器
* @param cls
*/
public static void printConstructors(Class cls){
Constructor[] constructors = cls.getDeclaredConstructors();
for(Constructor constructor : constructors){
StringBuffer result = new StringBuffer();
String name = constructor.getName();
String modifiers = Modifier.toString(constructor.getModifiers());
if(modifiers.length() > 0){
result.append("\t").append(modifiers).append(" ").append(name).append("(");
} Class[] params = constructor.getParameterTypes();
for(int j = 0; j < params.length; j++){
if(j > 0){
result.append(",");
}
result.append(params[j].getName());
}
result.append(")");
System.out.println(result.toString());
}
} public static void printMethods(Class cls){
Method[] methods = cls.getDeclaredMethods();
for(Method method : methods){
StringBuffer result = new StringBuffer();
String name = method.getName();
Class returnType = method.getReturnType();
String modifier = Modifier.toString(method.getModifiers());
Class[] params = method.getParameterTypes(); if(modifier.length() > 0){
result.append("\t").append(modifier).append(" ")
.append(returnType.getName()).append(" ").append(name).append("(");
} for(int j = 0; j < params.length; j++){
if(j > 0){
result.append(",");
}
result.append(params[j].getName());
}
result.append(")");
System.out.println(result.toString());
}
} }

再回首,Java温故知新(十一):Java反射的更多相关文章

  1. 再回首,Java温故知新——开篇说明

    不知不觉在IT界从业2年了,两年时间足够一个人成长很多,当然也会改变很多事.在这两年时间里,随着对技术的深入了解,知识面的拓展以及工作难度的增大,渐渐的感觉自己技术方面根基不稳,多数问题也只是做到知其 ...

  2. 再回首,Java温故知新(一):Java概述

    Java发展历程 Java的发展要追溯到1991年,Patrick Naughton(帕特里克·诺顿)和James Gosling(詹姆斯·高斯林)带领Sun公司的工程师打算为有线电视转换盒之类的消费 ...

  3. JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题

    JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...

  4. java基础(十一 )-----反射——Java高级开发必须懂的

    本文我们通过一个实际的例子来演示反射在编程中的应用,可能之前大家对反射的学习,仅仅是停留在概念层面,不知道反射究竟应用在哪,所以是一头雾水.相信通过这篇教程,会让你对反射有一个更深层次的认知. 概念 ...

  5. 回首Java——再回首JDK

    如果你是刚要被Java军训的新兵,可有几时对环境搭建而不知所措?又如若你是驰骋Java战场多年的老将,可曾拿起陪伴你许久的82年的JDK回味一番?今天我们就来道一道JDK,重新来认识认识这个既熟悉又陌 ...

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

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

  7. java学习:用反射构造bean

    先贴一些反射的基本知识:-------------------------------------------------------------------- 一.什么是反射:反射的概念是由Smit ...

  8. 反射那些事儿——Java动态装载和反射技术

    一直以来反射都是只闻其声,却无法将之使用,近日尽心下来学习下,发现了很多精妙之处. Java动态装载和反射技术 一.类的动态装载 1.Java代码编译和执行的整个过程包含了以下三个重要的机制: ● J ...

  9. java工厂类与反射机制

    java 简单工厂类 2012-04-22 15:44:07|  分类: java |  标签:java工厂类  简单工厂类  |举报|字号 订阅     简单工厂模式需要由以下角色组成: 接口    ...

随机推荐

  1. paramiko学习

    1. ssh简介 2. ssh私有key/共有key的区别 3. paramiko的常规使用

  2. js 时间函数 及相关运算大全

    js 时间函数 及相关运算大全 var myDate = new Date(); myDate.getYear();        //获取当前年份(2位) myDate.getFullYear(); ...

  3. 写的一个Makefile

    #========================================================================= # # MAKE FILE FOR ROCKY # ...

  4. bzoj 1406: [AHOI2007]密码箱 二次剩餘

    1406: [AHOI2007]密码箱 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 701  Solved: 396[Submit][Status] D ...

  5. [topcoder]CoinReversing

    http://community.topcoder.com/stat?c=problem_statement&pm=11473&rd=14543 简单的概率题.那道题想了想就出来了.每 ...

  6. 最完整的合并相交集合的Java代码(查并集)

    这个是自己写的算法,如果有大牛,麻烦帮我并行化.初学者则可以学到不少东西. 产生测试用例 import java.io.*; import java.util.Random; public class ...

  7. c++重载、覆盖和隐藏

    看以前的:http://www.cnblogs.com/youxin/p/3305688.html 答案:a.成员函数被重载的特征:overload(1)相同的范围(在同一个类中):(2)函数名字相同 ...

  8. BZOJ3439: Kpm的MC密码

    3439: Kpm的MC密码 Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 166  Solved: 79[Submit][Status] Descr ...

  9. selenium资料

    来源 http://release.seleniumhq.org/selenium-remote-control/0.9.2/doc/dotnet/Selenium.ISelenium.MouseMo ...

  10. 用xib文件,配置UITableViewCell

    http://www.cnblogs.com/lixingle/p/3287499.html 在运行时候,如果出现“this class is not key value coding-complia ...