再回首,Java温故知新(十一):Java反射
最近继续回顾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反射的更多相关文章
- 再回首,Java温故知新——开篇说明
不知不觉在IT界从业2年了,两年时间足够一个人成长很多,当然也会改变很多事.在这两年时间里,随着对技术的深入了解,知识面的拓展以及工作难度的增大,渐渐的感觉自己技术方面根基不稳,多数问题也只是做到知其 ...
- 再回首,Java温故知新(一):Java概述
Java发展历程 Java的发展要追溯到1991年,Patrick Naughton(帕特里克·诺顿)和James Gosling(詹姆斯·高斯林)带领Sun公司的工程师打算为有线电视转换盒之类的消费 ...
- JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题
JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...
- java基础(十一 )-----反射——Java高级开发必须懂的
本文我们通过一个实际的例子来演示反射在编程中的应用,可能之前大家对反射的学习,仅仅是停留在概念层面,不知道反射究竟应用在哪,所以是一头雾水.相信通过这篇教程,会让你对反射有一个更深层次的认知. 概念 ...
- 回首Java——再回首JDK
如果你是刚要被Java军训的新兵,可有几时对环境搭建而不知所措?又如若你是驰骋Java战场多年的老将,可曾拿起陪伴你许久的82年的JDK回味一番?今天我们就来道一道JDK,重新来认识认识这个既熟悉又陌 ...
- Java进阶之reflection(反射机制)——反射概念与基础
反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...
- java学习:用反射构造bean
先贴一些反射的基本知识:-------------------------------------------------------------------- 一.什么是反射:反射的概念是由Smit ...
- 反射那些事儿——Java动态装载和反射技术
一直以来反射都是只闻其声,却无法将之使用,近日尽心下来学习下,发现了很多精妙之处. Java动态装载和反射技术 一.类的动态装载 1.Java代码编译和执行的整个过程包含了以下三个重要的机制: ● J ...
- java工厂类与反射机制
java 简单工厂类 2012-04-22 15:44:07| 分类: java | 标签:java工厂类 简单工厂类 |举报|字号 订阅 简单工厂模式需要由以下角色组成: 接口 ...
随机推荐
- Winbind authentication against active directory
Winbind authentication against active directory Description This tip will describe how to configure ...
- JVM原理
Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’(.class文件,也就是0,1二进制程序),然后在OS之上的Java解释器中解释执行,而JVM是java的核心和基础,在ja ...
- Spire.XLS
又一款Excel处理神器Spire.XLS,你值得拥有(二) 前言:上篇 C#组件系列——又一款Excel处理神器Spire.XLS,你值得拥有 介绍了下组件的两个功能,说不上特色,但确实能解决我 ...
- BZOJ 4010 菜肴制作
Description 知名美食家小A被邀请至ATM 大酒店,为其品评菜肴. ATM酒店为小A准备了\(N\)道菜肴,酒店按照为菜肴预估的质量从高到低给予\(1\)到\(N\)的顺序编号,预估质量最高 ...
- uva 1203 - Argus
简单的优先队列的应用: 代码: #include<queue> #include<cstdio> using namespace std; struct node { int ...
- 【POJ1082】Calendar Game (博弈)
[题目] Description Adam and Eve enter this year's ACM International Collegiate Programming Contest. La ...
- iPhone之Quartz 2D系列--图形上下文(2)(Graphics Contexts)
以下几遍关于Quartz 2D博文都是转载自:http://www.cocoachina.com/bbs/u.php?action=topic&uid=38018 iPhone之Quartz ...
- zoj 3088 Easter Holidays(最长路+最短路+打印路径)
Scandinavians often make vacation during the Easter holidays in the largest ski resort Are. Are prov ...
- BZOJ1617: [Usaco2008 Mar]River Crossing渡河问题
1617: [Usaco2008 Mar]River Crossing渡河问题 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 654 Solved: 4 ...
- HDU-4902 Nice boat
Nice boat Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...