具有能够分析类能力的程序被称为反射,使用反射库可以编写能够动态操纵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为反射包,里面有以下四个类:

              1. Fiend

                属性

                getDeclareFields()  & getFields()

              2. Method

                方法

                getDeclareMethods() & getMethods()

              3. Constructor

                构造

                getDeclareConstructor()  & getConstructor()

              4. 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)(一)的更多相关文章

  1. Java反射学习总结终(使用反射和注解模拟JUnit单元测试框架)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 本文是Java反射学习总结系列的最后一篇了,这里贴出之前文章的链接,有兴趣的可以打开看看. ...

  2. Java反射学习总结四(动态代理使用实例和内部原理解析)

    通过上一篇文章介绍的静态代理Java反射学习总结三(静态代理)中,大家可以发现在静态代理中每一个代理类只能为一个接口服务,这样一来必然会产生过多的代理,而且对于每个实例,如果需要添加不同代理就要去添加 ...

  3. Java反射学习系列-绪论

    Java反射学习系列-绪论 https://blog.csdn.net/hanchao5272/article/details/79358924

  4. Java反射学习(java reflect)(二)

    ok之前说了Java的反射和反射分析类,那这些东西有神马作用呢,下面就来说应用: 三.运行时使用反射分析对象 简单写一个Employee类,然后利用JAVA反射去取name域,getDeclareFi ...

  5. Java反射学习:深入学习Java反射机制

    一.Java反射的理解(反射是研究框架的基础之一) Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的 ...

  6. java反射学习笔记

    1.java反射概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功 ...

  7. Java 反射学习笔记

    要学反射,先要了解Class这个类,Class是所有Java类的一个总称,Class的实例中存储的是一个类的字节码,获取Class的实例有三种方式: System.class new Date().g ...

  8. JAVA反射学习网摘

    程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动 ...

  9. Java反射学习一

    Java 反射机制 基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象 ...

  10. Java反射学习总结二(用反射调用对象的私有属性和方法)

    大家都知道正常的调用是不可以访问对象的private修饰的属性和方法的,这也是Java的封装性原则. 但是有没有方法可以强制去访问对象的private修饰的属性和方法呢?那就是用反射!(这个可能在面试 ...

随机推荐

  1. java static 执行顺序

    先加载类,然后再实例化类. 继承与static 面试题目如下:请写出程序执行完成之后的结果. package extend; public class X { Y y=new Y(); static{ ...

  2. 动态规划(树形DP):HDU 5886 Tower Defence

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA2MAAAERCAIAAAB5Jui9AAAgAElEQVR4nOy9a6wsS3YmFL/cEkh4LP

  3. LoadRunner的场景设置

    loadrunner场景设置的方法: 1.逐步增加用户数,分多次去运行场景.比如:第一次运行50并发,第二次运行100并发…… 2.针对同一个脚本设置多个组,使用组策略(点击Edit Schedule ...

  4. redis ins 调试

    Redis简介: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工 ...

  5. 钥匙计数之一 - HDU 1438(状态压缩打表)

    分析:首先想到每个钥匙的结尾有4种状态,不过题目还需要判断有三种不同的钥匙深度,所以每种深度结尾后有2^4种状态,0000->1111,不过题目还需需要有相邻的钥匙深度大于等于3,所以需要两种不 ...

  6. CSS3新特性(阴影、动画、渐变、变形、伪元素等)

    CSS3与页面布局学习总结(六)--CSS3新特性(阴影.动画.渐变.变形.伪元素等)   目录 一.阴影 1.1.文字阴影 1.2.盒子阴影 二.背景 2.1.背景图像尺寸 2.2.背景图像显示的原 ...

  7. ecshop格式化商品价格

    <?php /** * 格式化商品价格 * * @access public * @param float $price 商品价格 * @return string */ function pr ...

  8. AlertDialog.Builder setCancelable用法

    AlertDialog.Builder的setCancelable public AlertDialog.Builder setCancelable (boolean cancelable) Sinc ...

  9. const char*, char const* and char *const 分类: C/C++ OpenCV 2014-11-08 18:10 114人阅读 评论(0) 收藏

    const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目.  事实上这个概念谁都有只是三种声明方式非常相似很容易记混.  Bjarne在他的 ...

  10. ssss

    18:15 2013/6/18 未结束的事情1 应用API接口切换2 03in.com 项目管理授权 软件中不成功3 党校考核时间 段列出所有 10:51 2013/6/20 daili 应用修改1 ...