最近继续回顾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. Ipv6_Only-b

    网上好多关于ipv6的资料,说半天ipv6是什么,怎么建立测试环境,,,可是没有看到具体的操作和解决的方案,这里,为大家提供一种方案,希望给大家带来帮助吧. 总的来说有三个方面需要进行检查和修改: 1 ...

  2. java高级:weakReference

    Java WeakReference的理解与使用 http://www.tuicool.com/articles/imyueq

  3. [BZOJ 1018] [SHOI2008] 堵塞的交通traffic 【线段树维护联通性】

    题目链接:BZOJ - 1018 题目分析 这道题就说明了刷题少,比赛就容易跪..SDOI Round1 Day2 T3 就是与这道题类似的..然而我并没有做过这道题.. 这道题是线段树维护联通性的经 ...

  4. LA 3904

    一道DP题: 一共有三种砖,1*2,2*1,2*2,然后要你铺满整个n*2的地板,求不重复的铺法数: 方法: 首先计算了不考虑对称的情况,然后计算只考虑对称的情况: 所以结果就是(不考虑对称数+只考虑 ...

  5. 安卓天天练练(四)drawable state 属性

    今天又作茧自缚(item 写成 itme ╮(╯▽╰)╭ elipse还自动闭合了标签,来回查查查看报错,为啥点击无效呢!) 真欠抽,怪不得上班地铁上被个sb踢到脚趾头(目测有可能是同家公司的..同站 ...

  6. GConf 错误:联系配置服务器失败;某些可能原因是需要为 ORBit 启用 TCP/IP 联网

    http://blog.csdn.net/heirenheiren/article/details/8107294 http://blog.sina.com.cn/s/blog_8097f8aa010 ...

  7. restful风格,restcontroller与controller

    restful风格,restcontroller与controller 初步接触springmvc的时候,被要求使用restful风格,彼时一头雾水,不懂何谓restful,参阅了很多资料,慢慢的接触 ...

  8. bzoj1898

    这是yhc大牛矩乘论文上的题目,那里面分析得很清楚了这里就说说我一开始错的地方,我一开始处理每个时刻能通过的邻接矩阵的时候把以不能访问的点i为起点和终点的都标记为0了,实际上只能标记以i为终点的边即可 ...

  9. poj2151

    求每只队伍都回答出题目,且至少有一只队伍回答出n道题的概率存在性问题我们可以转化为任意性问题用P(每支队伍都回答出题目)-P(每只队伍回答的题目数小于n)然后我们可以递推求解 ..,..,..] of ...

  10. BZOJ1599: [Usaco2008 Oct]笨重的石子

    1599: [Usaco2008 Oct]笨重的石子 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 758  Solved: 513[Submit][ ...