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为反射包,里面有以下四个类:

              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:

  

  1         import java.lang.reflect.Constructor;
  2         import java.lang.reflect.Field;
  3         import java.lang.reflect.Method;
  4         import java.lang.reflect.Modifier;
  5         import java.util.Scanner;
  6         /**
  7          * waring : params part will be changed if param was array
  8          *             ex. byte[] --> [B
  9          */
 10
 11         public class ReflectionTest {
 12             public static void main(String[] args) {
 13                 String name;
 14                 if(args.length>0){
 15                     name=args[0];
 16                 }else{
 17                     Scanner in =new Scanner(System.in);
 18                     System.out.println("Enter class name (e.g. java.util.Date):");
 19                     name=in.next();
 20                     System.out.println("Input:"+name);
 21                 }
 22                 try {
 23                     Class cl=Class.forName(name);
 24                     Class superCl=cl.getSuperclass();    //super one
 25                     Class[] interfacesCl=cl.getInterfaces();
 26                     String modifiers=Modifier.toString(cl.getModifiers());
 27                     if(modifiers.length()>0){
 28                         System.out.print(modifiers+" ");
 29                     }
 30                     System.out.print("class "+name);
 31
 32                     if(superCl!=null && superCl !=Object.class){
 33                         System.out.print(" extends "+superCl.getName());
 34                     }
 35                     for(int i=0;i<interfacesCl.length;i++){
 36                         if(i==0){
 37                             System.out.print(" implements ");
 38                         }
 39                         if(i>0){
 40                             System.out.print(",");
 41                         }
 42                         System.out.print(interfacesCl[i].getName());
 43                     }
 44                     System.out.print("\n{\n");
 45                     printConstructors(cl);
 46                     System.out.println();
 47                     printMethod(cl);
 48                     System.out.println();
 49                     pritField(cl);
 50                     System.out.println("}");
 51                 } catch (ClassNotFoundException e) {
 52                     e.printStackTrace();
 53                 }
 54             }
 55             /**
 56              * Prints all constructors of a class
 57              * @param cl
 58              */
 59             public static void printConstructors(Class cl){
 60                 Constructor[] constructors=cl.getConstructors();
 61                 for(Constructor c:constructors){
 62                     String name=c.getName();
 63                     System.out.print("    ");
 64                     String modifiers=Modifier.toString(c.getModifiers());
 65                     if(modifiers.length()>0){
 66                         System.out.print(modifiers+" ");
 67                     }
 68                     System.out.print(name+"(");
 69
 70                     Class[] paramTypes=c.getParameterTypes();
 71                     for(int i=0;i<paramTypes.length;i++){
 72                         if(i>0){
 73                             System.out.print(",");
 74                         }
 75                         System.out.print(paramTypes[i].getName());
 76                     }
 77                     System.out.println(");");
 78                 }
 79             }
 80
 81             /**
 82              * Prints all method of a class
 83              * @param cl
 84              */
 85             public static void printMethod(Class cl){
 86                 Method[] methods=cl.getMethods();
 87                 for(Method m:methods){
 88                     String name =m.getName();
 89                     System.out.print("    ");
 90                     String modifiers=Modifier.toString(m.getModifiers());
 91                     if(modifiers.length()>0){
 92                         System.out.print(modifiers+" ");
 93                     }
 94                     System.out.print(name+"(");
 95                     Class[] params=m.getParameterTypes();
 96                     for(int i=0;i<params.length;i++){
 97                         if(i>0){
 98                             System.out.print(",");
 99                         }
100                         System.out.print(params[i].getName());
101                     }
102                     System.out.println(");");
103                 }
104             }
105
106             public static void pritField(Class cl){
107                 Field[] fields=cl.getFields();
108                 for(Field field:fields){
109                     String name=field.getName();
110                     System.out.print("    ");
111                     String str_fields=Modifier.toString(field.getModifiers());
112                     if(str_fields.length()>0){
113                         System.out.print(str_fields+" ");
114                     }
115                     System.out.println(name+";");
116                 }
117             }
118         }

Result:

这里要注意有一点坑坑的,就是如果你的参数是个数组的话参数打印那里会出现奇怪的表达:

例如: byte[] --> [B

时间: 2024-12-21 21:22:03

Java反射学习(java reflect)(一)的相关文章

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

本文是Java反射学习总结系列的最后一篇了,这里贴出之前文章的链接,有兴趣的可以打开看看. http://blog.csdn.net/a396901990/article/category/2302221 本文介绍了如何利用反射和注解去简单的模拟JUnit4单元测试框架,之所以选择JUnit4是因为4.0以后最大的改进就是使用了注解.需要注意的是这里并不是完全的模拟,只是简单实现了一下Runner类和JUnit注解相关的工作流程.所以本文的主要目的是介绍反射和注解的使用.废话不多说,直接进入正文

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

通过上一篇文章介绍的静态代理Java反射学习总结三(静态代理)中,大家可以发现在静态代理中每一个代理类只能为一个接口服务,这样一来必然会产生过多的代理,而且对于每个实例,如果需要添加不同代理就要去添加相应的代理类.解决这一问题最好的做法是可以通过一个代理类完成全部的代理功能或者说去动态的生成这个代理类,那么此时就必须使用动态代理完成. 动态代理知识点: Java动态代理类位于java.lang.reflect包下,主要有以下一个接口和一个类: 1.InvocationHandler接口:    

Java反射学习总结

广州疯狂软件教育Java培训,iOS培训分享Class类是Reflection API中核心的类,他位于java.lang.Class列出一些常用的方法.- getName() : 获得类的完整名字- getFields() : 获得类的public类型的属性- getDeclaredFields() : 获得类的所有属性- getMethods() : 获得类的public类型的方法- getDeclaredMethods() : 获得类的所有方法- getMethod(String name

java多线程学习--java.util.concurrent

CountDownLatch,api 文档:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes. 假设我们要打印1-100,最

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

ok之前说了Java的反射和反射分析类,那这些东西有神马作用呢,下面就来说应用: 三.运行时使用反射分析对象 简单写一个Employee类,然后利用JAVA反射去取name域,getDeclareField(String  name)可以取得全部,就算是private的上面说过了,所以到第9行还是没问题的. .. 但是在第11行的时候错了,因为get(Field f)没有访问权限所以IllegalAccessException,在这里有个方法setAccessible(Boolean b),这货

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

一.Java反射的理解(反射是研究框架的基础之一) Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制. 二.逐步分析 参考:https://blog.csdn.net/u012585964/article/details/52011138 1.关于Class 1.Class是一个类,一个描述类的类(也就是描述类本身),封装了描述方法的Met

Java反射学习一

Java 反射机制 基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象的方法的功能来自于Java语言的反射(Reflection)机制. Java反射机制主要提供了以下功能: 1.在运行时判断任意一个对象所属的类. 2.在运行时构造任意一个类的对象. 3.在运行时判断任意一个类所具有的成员变量和方法. 4.在运行时调用任意一个对象的方法. Reflection是Jav

JAVA反射学习网摘

程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载.探知.使用编译期间完全未知的classes.Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对象:在运行时判断任意一个类所具有的成员变量和方法:在运行时调用任意一个对象的方法:生成动态

黑马程序员------Java反射学习总结(一)

-------------------------Java培训.Android培训,期待与您交流!----------------------------- 一.反射的概念 1) Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 2)一句话来讲,反射就是将Java类中的各个成分映射成相应的Java类. 3)即在Java中,描述事物的各种

java反射学习之二万能EXCEL导出

一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对象的所有属性作为EXCEL的列,该对象占据EXCEL的一行 二.万能EXCEL导出(以JXL为例,jxl.poi等excel导入导出的jar包不做介绍了) 1.创建java工程.引入jxl的jar包 2.直接上代码 Book.java /** * Book对象 * @author bwy * */