JAVA reflect (反射) 分析类结构

一、数据准备

Java反射分析用到的Human类

package ReflectAnalysis;

public class Human {
    public String name;
    private int age;

    public Human(String name, int age){
        this.name = name;
        this.setAge(age);
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }
}

二、反射分析类域

name域为例:

public String name;

其中,反射分析如下
1. 获取JAVA修饰符,如 public、protected、final、static等,java reflect api:

Modifier.toString(fields[i].getModifiers())

其中fields[i].getModifiers()获得以整数形式返回的该 Field 对象表示的字段的 Java 语言修饰符。 Modifier.toString()方法返回Java 语言修饰符的字符串形式。

  1. JAVA API对修饰符的说明:修饰符由 Java 虚拟机的 public、protected、private、final、static、abstract 和 interface 对应的常量组成;它们应当使用 Modifier 类的方法来解码。
  2. 当有多个修饰符修饰变量时,Field对象的getModifiers返回的整数值不同,例如当修饰符只有public时,返回值为1;当修饰符为public static时,返回值为9。JDK源码中对返回值的定义如下

    /*
     * Access modifier flag constants from <em>The Java Virtual
     * Machine Specification, Second Edition</em>, tables 4.1, 4.4,
     * 4.5, and 4.7.
     */
    /**
     * The <code>int</code> value representing the <code>public</code> 
     * modifier.
     */    
    public static final int PUBLIC           = 0x00000001;
    /**
     * The <code>int</code> value representing the <code>private</code> 
     * modifier.
     */    
    public static final int PRIVATE          = 0x00000002;
    /**
     * The <code>int</code> value representing the <code>protected</code> 
     * modifier.
     */    
    public static final int PROTECTED        = 0x00000004;
    /**
     * The <code>int</code> value representing the <code>static</code> 
     * modifier.
     */    
    public static final int STATIC           = 0x00000008;
    /**
     * The <code>int</code> value representing the <code>final</code> 
     * modifier.
     */    
    public static final int FINAL            = 0x00000010;
    /**
     * The <code>int</code> value representing the <code>synchronized</code> 
     * modifier.
     */    
    public static final int SYNCHRONIZED     = 0x00000020;
    /**
     * The <code>int</code> value representing the <code>volatile</code> 
     * modifier.
     */    
    public static final int VOLATILE         = 0x00000040;
    /**
     * The <code>int</code> value representing the <code>transient</code> 
     * modifier.
     */    
    public static final int TRANSIENT        = 0x00000080;
    /**
     * The <code>int</code> value representing the <code>native</code> 
     * modifier.
     */    
    public static final int NATIVE           = 0x00000100;
    /**
     * The <code>int</code> value representing the <code>interface</code> 
     * modifier.
     */    
    public static final int INTERFACE        = 0x00000200;
    /**
     * The <code>int</code> value representing the <code>abstract</code> 
     * modifier.
     */    
    public static final int ABSTRACT         = 0x00000400;
    /**
     * The <code>int</code> value representing the <code>strictfp</code> 
     * modifier.
     */    
    public static final int STRICT           = 0x00000800;
    // Bits not (yet) exposed in the public API either because they
    // have different meanings for fields and methods and there is no
    // way to distinguish between the two in this class, or because
    // they are not Java programming language keywords
    static final int BRIDGE    = 0x00000040;
    static final int VARARGS   = 0x00000080;
    static final int SYNTHETIC = 0x00001000;
    static final int ANNOTATION= 0x00002000;
    static final int ENUM      = 0x00004000;
  3. Modifier.toString()源码如下:
    public static String toString(int mod) {
        StringBuffer sb = new StringBuffer();
        int len;
        if ((mod & PUBLIC) != 0)    sb.append("public ");
        if ((mod & PROTECTED) != 0) sb.append("protected ");
        if ((mod & PRIVATE) != 0)   sb.append("private ");
        /* Canonical order */
        if ((mod & ABSTRACT) != 0)  sb.append("abstract ");
        if ((mod & STATIC) != 0)    sb.append("static ");
        if ((mod & FINAL) != 0)     sb.append("final ");
        if ((mod & TRANSIENT) != 0) sb.append("transient ");
        if ((mod & VOLATILE) != 0)  sb.append("volatile ");
        if ((mod & SYNCHRONIZED) != 0)  sb.append("synchronized ");
        if ((mod & NATIVE) != 0)    sb.append("native ");
        if ((mod & STRICT) != 0)    sb.append("strictfp ");
        if ((mod & INTERFACE) != 0) sb.append("interface ");
        if ((len = sb.length()) > 0)    /* trim trailing space */
            return sb.toString().substring(0, len-1);
        return "";
        }

2.获取域数据类型

fields[i].getType().getName();

3.Field域反射分析代码

public static void printFields(Class<?> classobj){
        System.out.println("    //Fileds");
        String modifier = "";
        String type = "";
        String name = "";
        Field [] fields = classobj.getDeclaredFields();
        for(int i = 0; i <= fields.length - 1; i++){
            modifier = Modifier.toString(fields[i].getModifiers());
            type = fields[i].getType().getName();
            name = fields[i].getName();
            System.out.println("    " + modifier + " " + type + " " + name + ";");
        }
        System.out.println();
    }

三、反射分析类方法

以如下方法为例

public void setAge(int age) {
        this.age = age;
    }

1.获取JAVA修饰符
参照第二部分的反射分析类域中内容。
2.获取方法的返回值

methods[i].getReturnType().getName();

3.获取方法的参数

Class [] paraClasses = methods[i].getParameterTypes();

4.Method方法反射分析代码

public static void printMethods(Class<?> classobj){
        System.out.println("    //Methods");
        String modifier = "";
        String returnType = "";
        String name = "";
        Class [] paraClasses = null;
        StringBuffer paraType = new StringBuffer();
        Method [] methods = classobj.getDeclaredMethods();
        for(int i = 0; i <= methods.length - 1; i++){
            modifier = Modifier.toString(methods[i].getModifiers());
            returnType = methods[i].getReturnType().getName();
            name = methods[i].getName();
            paraClasses = methods[i].getParameterTypes();
            for(int j = 0; j <= paraClasses.length - 1; j++){
                if(j != paraClasses.length - 1){
                    paraType.append(paraClasses[j].getName() + ", ");
                }
                else{
                    paraType.append(paraClasses[j].getName());
                }
            }
            System.out.println("    " + modifier + " " + returnType + " " + name + "(" + paraType.toString() + ")");
        }
        System.out.println();
    }

四、反射分析类构造器方法

参照第三部分反射分析类方法
构造器方法反射分析代码

public static void printConstructors(Class<?> classobj){
        System.out.println("    //Constructors");
        Constructor [] constructors = classobj.getConstructors();
        String modifier = "";
        String name = "";
        Class [] paraClasses = null;
        StringBuffer paraType = new StringBuffer();
        for(int i = 0; i <= constructors.length - 1; i++){
            modifier = Modifier.toString(constructors[i].getModifiers());
            name = constructors[i].getName();
            paraClasses = constructors[i].getParameterTypes();
            for(int j = 0; j <= paraClasses.length - 1; j++){
                if(j != paraClasses.length - 1){
                    paraType.append(paraClasses[j].getName() + ", ");
                }
                else{
                    paraType.append(paraClasses[j].getName());
                }
            }
            System.out.println("    " + modifier + " " + name + "(" + paraType.toString() + ")");
        }
        System.out.println();
    }

五、程序完整测试代码

package ReflectAnalysis;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class ClassReflectAnalysis {

    public static void main(String[] args) {
        Class<Human> classobj = Human.class;

        String parentName = classobj.getSuperclass().getName();
        String modifier = Modifier.toString(classobj.getModifiers());
        Class [] interfaces = classobj.getInterfaces();
        StringBuffer interfacesBuf = new StringBuffer();
        if(interfaces.length != 0){
            interfacesBuf.append("implements ");
            for(int i = 0; i <= interfaces.length - 1; i++){
                if(i != interfaces.length - 1){
                    interfacesBuf.append(interfaces[i].getName() + ",");
                }else{
                    interfacesBuf.append(interfaces[i].getName());
                }
            }
        }
        String Header = modifier + " class " + classobj.getName() + " extends " + parentName + interfacesBuf.toString() + "{";
        System.out.println(Header + "\n");

        printFields(classobj);
        printMethods(classobj);
        printConstructors(classobj);

        System.out.println("}");
    }

    public static void printFields(Class<?> classobj){
        System.out.println("    //Fileds");
        String modifier = "";
        String type = "";
        String name = "";
        Field [] fields = classobj.getDeclaredFields();
        for(int i = 0; i <= fields.length - 1; i++){
            modifier = Modifier.toString(fields[i].getModifiers());
            type = fields[i].getType().getName();
            name = fields[i].getName();
            System.out.println("    " + modifier + " " + type + " " + name + ";");
        }
        System.out.println();
    }

    public static void printMethods(Class<?> classobj){
        System.out.println("    //Methods");
        String modifier = "";
        String returnType = "";
        String name = "";
        Class [] paraClasses = null;
        StringBuffer paraType = new StringBuffer();
        Method [] methods = classobj.getDeclaredMethods();
        for(int i = 0; i <= methods.length - 1; i++){
            modifier = Modifier.toString(methods[i].getModifiers());
            returnType = methods[i].getReturnType().getName();
            name = methods[i].getName();
            paraClasses = methods[i].getParameterTypes();
            for(int j = 0; j <= paraClasses.length - 1; j++){
                if(j != paraClasses.length - 1){
                    paraType.append(paraClasses[j].getName() + ", ");
                }
                else{
                    paraType.append(paraClasses[j].getName());
                }
            }
            System.out.println("    " + modifier + " " + returnType + " " + name + "(" + paraType.toString() + ")");
        }
        System.out.println();
    }

    public static void printConstructors(Class<?> classobj){
        System.out.println("    //Constructors");
        Constructor [] constructors = classobj.getConstructors();
        String modifier = "";
        String name = "";
        Class [] paraClasses = null;
        StringBuffer paraType = new StringBuffer();
        for(int i = 0; i <= constructors.length - 1; i++){
            modifier = Modifier.toString(constructors[i].getModifiers());
            name = constructors[i].getName();
            paraClasses = constructors[i].getParameterTypes();
            for(int j = 0; j <= paraClasses.length - 1; j++){
                if(j != paraClasses.length - 1){
                    paraType.append(paraClasses[j].getName() + ", ");
                }
                else{
                    paraType.append(paraClasses[j].getName());
                }
            }
            System.out.println("    " + modifier + " " + name + "(" + paraType.toString() + ")");
        }
        System.out.println();
    }
}

六、运行结果

public class ReflectAnalysis.Human extends java.lang.Object{

    //Fileds
    public java.lang.String name;
    private int age;

    //Methods
    public void setAge(int)
    public int getAge(int)

    //Constructors
    public ReflectAnalysis.Human(java.lang.String, int)

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值