您的位置:首页 > 编程语言 > Java开发

JAVA reflect (反射) 分析类结构

2016-04-26 13:25 453 查看

一、数据准备

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 语言修饰符的字符串形式。

JAVA API对修饰符的说明:修饰符由 Java 虚拟机的 public、protected、private、final、static、abstract 和 interface 对应的常量组成;它们应当使用 Modifier 类的方法来解码。

当有多个修饰符修饰变量时,
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;


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)

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: