Java反射学习(java reflect)(一)
具有能够分析类能力的程序被称为反射,使用反射库可以编写能够动态操纵Java代码的程序。
一、开始
背景:Java运行时系统始终对所有对象维护一个被称为Runtime的类型标识,然后这货save着每个对象所属类的足迹,虚拟机利用运行时信息选择相应方法执行。保存这些信息的类为Class,取得Class的实例化对象就可以进行下一步的操作了:
- Class类:
- 取得Class类对象的三种方法:
- getClass():
- Hehe e; Class cl=e.getClass();
- forName(String name):
- String className="java.util.Date"; Class cl=Class.forName(className);
- T.class:
- Class cl1=Date.class;
二、使用反射分析类
发射机制的最重要内容--检测类的结构。
Java.lang.reflect为反射包,里面有以下四个类:
Fiend
属性
getDeclareFields() & getFields()
Method
方法
getDeclareMethods() & getMethods()
Constructor
构造
getDeclareConstructor() & getConstructor()
Modifier
修饰
getModifiers()
对于Fiend , Method , Constructor 都有一个方法 getName() ,可以用来取得属性|方法|构造名,
然后上面每个类最后的两个方法,有Declare的那个是取得全部域、方法、构造器,
没有Declare的那个是取得public型的域、方法、构造器。
对于Modifier,有方法getModifiers(),用来取得一个int型值,放入Modifier.toString(int a)中就能得到对应的修饰法。(即public,private等)。
p.s.对于Modifier的getModifiers()取得int后,还有许多判断方法,都是is开头的.
Code:
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;
/**
* waring : params part will be changed if param was array
* ex. byte[] --> [B
*/ public class ReflectionTest {
public static void main(String[] args) {
String name;
if(args.length>0){
name=args[0];
}else{
Scanner in =new Scanner(System.in);
System.out.println("Enter class name (e.g. java.util.Date):");
name=in.next();
System.out.println("Input:"+name);
}
try {
Class cl=Class.forName(name);
Class superCl=cl.getSuperclass(); //super one
Class[] interfacesCl=cl.getInterfaces();
String modifiers=Modifier.toString(cl.getModifiers());
if(modifiers.length()>0){
System.out.print(modifiers+" ");
}
System.out.print("class "+name); if(superCl!=null && superCl !=Object.class){
System.out.print(" extends "+superCl.getName());
}
for(int i=0;i<interfacesCl.length;i++){
if(i==0){
System.out.print(" implements ");
}
if(i>0){
System.out.print(",");
}
System.out.print(interfacesCl[i].getName());
}
System.out.print("\n{\n");
printConstructors(cl);
System.out.println();
printMethod(cl);
System.out.println();
pritField(cl);
System.out.println("}");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* Prints all constructors of a class
* @param cl
*/
public static void printConstructors(Class cl){
Constructor[] constructors=cl.getConstructors();
for(Constructor c:constructors){
String name=c.getName();
System.out.print(" ");
String modifiers=Modifier.toString(c.getModifiers());
if(modifiers.length()>0){
System.out.print(modifiers+" ");
}
System.out.print(name+"("); Class[] paramTypes=c.getParameterTypes();
for(int i=0;i<paramTypes.length;i++){
if(i>0){
System.out.print(",");
}
System.out.print(paramTypes[i].getName());
}
System.out.println(");");
}
} /**
* Prints all method of a class
* @param cl
*/
public static void printMethod(Class cl){
Method[] methods=cl.getMethods();
for(Method m:methods){
String name =m.getName();
System.out.print(" ");
String modifiers=Modifier.toString(m.getModifiers());
if(modifiers.length()>0){
System.out.print(modifiers+" ");
}
System.out.print(name+"(");
Class[] params=m.getParameterTypes();
for(int i=0;i<params.length;i++){
if(i>0){
System.out.print(",");
}
System.out.print(params[i].getName());
}
System.out.println(");");
}
} public static void pritField(Class cl){
Field[] fields=cl.getFields();
for(Field field:fields){
String name=field.getName();
System.out.print(" ");
String str_fields=Modifier.toString(field.getModifiers());
if(str_fields.length()>0){
System.out.print(str_fields+" ");
}
System.out.println(name+";");
}
}
}
Result:

这里要注意有一点坑坑的,就是如果你的参数是个数组的话参数打印那里会出现奇怪的表达:
例如: byte[] --> [B
Java反射学习(java reflect)(一)的更多相关文章
- Java反射学习总结终(使用反射和注解模拟JUnit单元测试框架)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 本文是Java反射学习总结系列的最后一篇了,这里贴出之前文章的链接,有兴趣的可以打开看看. ...
- Java反射学习总结四(动态代理使用实例和内部原理解析)
通过上一篇文章介绍的静态代理Java反射学习总结三(静态代理)中,大家可以发现在静态代理中每一个代理类只能为一个接口服务,这样一来必然会产生过多的代理,而且对于每个实例,如果需要添加不同代理就要去添加 ...
- Java反射学习系列-绪论
Java反射学习系列-绪论 https://blog.csdn.net/hanchao5272/article/details/79358924
- Java反射学习(java reflect)(二)
ok之前说了Java的反射和反射分析类,那这些东西有神马作用呢,下面就来说应用: 三.运行时使用反射分析对象 简单写一个Employee类,然后利用JAVA反射去取name域,getDeclareFi ...
- Java反射学习:深入学习Java反射机制
一.Java反射的理解(反射是研究框架的基础之一) Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的 ...
- java反射学习笔记
1.java反射概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功 ...
- Java 反射学习笔记
要学反射,先要了解Class这个类,Class是所有Java类的一个总称,Class的实例中存储的是一个类的字节码,获取Class的实例有三种方式: System.class new Date().g ...
- JAVA反射学习网摘
程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动 ...
- Java反射学习一
Java 反射机制 基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象 ...
- Java反射学习总结二(用反射调用对象的私有属性和方法)
大家都知道正常的调用是不可以访问对象的private修饰的属性和方法的,这也是Java的封装性原则. 但是有没有方法可以强制去访问对象的private修饰的属性和方法呢?那就是用反射!(这个可能在面试 ...
随机推荐
- [学习整理]eclipe/MyEclipse:重要的快捷键
一.查看大工程代码最重要的几个快捷键 其实有一些,直接在编辑器页面内右键也可查看相应的快捷键(比如F3,F4,Ctrl+O,Ctrl+T),但有些比较好用的快捷键,并不能能直接或方便地在eclipse ...
- Linux学习笔记27——共享内存
一 共享内存 共享内存是由IPC为进程创建的一个特殊的地址范围,它将出现在该进程的地址空间中.其他进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址.如果某个进程向 ...
- hdu 4091 Zombie’s Treasure Chest(数学规律+枚举)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4091 /** 这题的一种思路就是枚举了: 基于这样一个事实:求出lcm = lcm(s1,s2), n ...
- 爬虫技术浅析 | z7y Blog
爬虫技术浅析 | z7y Blog 爬虫技术浅析
- JavaScript之闭包与高阶函数(一)
JavaScript虽是一门面向对象的编程语言,但同时也有许多函数式编程的特性,如Lambda表达式,闭包,高阶函数等. 函数式编程是种编程范式,它将电脑运算视为函数的计算.函数编程语言最重要的基础是 ...
- Google桌面搜索引擎
本博文的主要内容有 .Google桌面搜索引擎的下载 .Google桌面搜索引擎的安装 .Google桌面搜索引擎的使用 1.Google桌面搜索引擎的下载 http://download.csd ...
- OC封装的TLV数据格式解析库
作者:朱克锋 邮箱:zhukefeng@iboxpay.com 转载请注明出处:http://blog.csdn.net/linux_zkf TLV是一种可变格式,意思就是: Type类型, Leng ...
- SQL 计算两个时间之差 分类: SQL Server 2014-07-04 10:57 119人阅读 评论(0) 收藏
SQL语句: A,B为两个字段,A为开始时间,B为结束时间,ss为秒. SELECT datediff(ss,A,B) FROM Table 详细:http://www.w3school.com.c ...
- IOS图标尺寸一览
iPhone专用程序: 图标名称 大小 圆角 用途 必需 Icon.png 57 X 57 10px 用于程序商店和在iPhone/iPod Touch中显示 必需 Icon@2x.png 114 X ...
- 树莓派安装mjpg-streamer视频监控 分类: Raspberry Pi 2015-04-12 23:41 144人阅读 评论(0) 收藏
原来使用Motion在树莓派上跑1280x720分辨率的三颗摄像头.占用内存太严重,关闭诸多功能之后还是不行.故转战mjpg-streamer. 首先安装所需软件 sudo apt-get insta ...