最近继续回顾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. CodeChef CBAL

    题面: https://www.codechef.com/problems/CBAL 题解: 可以发现,我们关心的仅仅是每个字符出现次数的奇偶性,而且字符集大小仅有 26, 所以我们状态压缩,记 a[ ...

  2. OpenCV for c++Builder

    整理日: 20154/6 Borland C++BuilderでOpenCVを使う 確認 Turbo C++ 2007/03 1. ダウンロード&インストール http://sourcefor ...

  3. hadoo namenode format 异常 java.net.UnknownHostException: localhost.localdomain: localhost.localdomain

    /etc/sysconfig/network换成你在hosts里设置的值 /etc/rc.d/init.d/network restart 重启网络 hostname后就会发现hostname变了,也 ...

  4. ping详解

    Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说“ping一下某机器,看是不是开着”.不能打开网页时会说“你先ping网关地址192.168.1.1试试”. ...

  5. 协定类型不具有 ServiceContractAttribute 特性

    协定类型 ZBMService.QueryHistoryData 不具有 ServiceContractAttribute 特性.若要定义有效协定,指定的类型(协定接口或服务类)必须具有 Servic ...

  6. vijosP1779国王游戏

    题目:https://vijos.org/p/1779 题解:忽然想起来我好像还没写过高精度除以单精度,于是拿这题练练手...没想到1A了... 代码: #include<cstdio> ...

  7. Solr4.4的安装与配置

    最近准备用Solr搭建项目,所以对其作了一些了解,我采用的是Solr4.4版本:这个版本的Solr相对于以前的版本改变很大,这里记一下自己安装与配置的过程. 网上很多关于Solr的教程都很老了,很多教 ...

  8. activity跳转关闭软件盘

    之前试过 if(getWindow().getAttributes().softInputMode==WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPE ...

  9. Hibernate(十一)多对多双向关联映射

    上次我们在中Hibernate从入门到精通(十)多对多单向关联映射讲解了一下多对多单向关联映射,这次我 们讲解一下七种映射中的最后一种多对多双向关联映射. 多对多双向关联映射 按照我们之前的惯例,先看 ...

  10. 如何优雅的输出PHP调试信息

    经常因为出现紧急bug而被老板骂的同事,为了更快的修复而直接利用线上的错误环境现场debug,并直接在页面上echo和dump.结果被老板发现了,又是一通臭骂.那么有没有什么办法更优雅的输出PHP调试 ...