具有能够分析类能力的程序被称为反射,使用反射库可以编写能够动态操纵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. 【HDOJ】1385 Minimum Transport Cost

    Floyd.注意字典序!!! #include <stdio.h> #include <string.h> #define MAXNUM 55 #define INF 0x1f ...

  2. How to disable Eclipse splash

    Run eclipse with the -nosplash option.

  3. Magic of David Copperfield II(奇偶性)

    题目大意:这是一个魔术游戏,首先把你的手指放在一个左上角的格子里面,然后魔术师说你可以移动K1步,移动完之后,他会删除一些方格,并且说,你肯定不在这里,删除的方格不可以再去了,然后让你再走K2步,继续 ...

  4. C语言中数据类型转换的学习

    1. 整型和枚举类型数据的转换 测试代码如下: #include <stdio.h> typedef enum _E_TYPE_T {     E_TYPE_1 = -1,     E_T ...

  5. C#在ASP.NET4.5框架下的首次网页应用

    运行效果预览: 先看实践应用要求: 1.编写一个函数,用于计算1!+2!+3!+4!+5!,在控制台或页面输出运行结果. 2.在控制台或页面输出九九乘法表. 3.输入10个以内的整数,输出该组整数的降 ...

  6. Codeforces Round #387(div 2)

    A =w= B VOV C QoQ D 题意:贝尔兰冬天很冷,那么司机要换上冬天专用轮胎才能开车.假设冬天一共有n天,有一套冬天专用轮胎,仅能使用k天,这套轮胎不管什么温度都能用,而夏天用的轮胎只能在 ...

  7. redis.config翻译

    # Redis configuration file example#redis配置文件范例 # Note on units: when memory size is needed, it is po ...

  8. web项目学习之基于注解的Controller

    1. 低版本Spring MVC 实现Controller 使用过低版本 Spring MVC 的读者都知道:当创建一个 Controller 时,我们需要直接或间接地实现 org.springfra ...

  9. [Javascript] Array - join()

    The join() method joins all elements of an array into a string. var name = 'shane osbourne'; var upp ...

  10. iOS Sqlite3 Demo 及 FMDB Demo

    本文是主要实现了三个函数: testSQLite3 是测试系统自带的sqlite3的demo testFMDB是测试FMDB存取简单的数据类型的 的demo testFMDB2是将任意对象作为一个整体 ...