首先我们模拟一个学生类来做一个实验,接下来部分是源码:
package com.sise.lh.reflect.domain;
/**
* @author:idea
* @date:2018/1/4
* @version: 1.0
*/
public class Student{
public int age;
public Student(){}
public Student(String name,int age){
this.age=age;
}
public String test01(){
return "null";
}
public String test02(){
return "null";
}
public String test03(){
return "null";
}
public String test04(){
return "null";
}
}
然后便是通过java的一系列反射来读取这个类的信息:
闲话不多说,直接上源码:
package com.sise.lh.reflect;
import java.lang.reflect.*;
import java.lang.reflect.Field;
import java.util.Date;
/**
* @author:idea
* @date:2018/1/4
* @version: 1.0
*/
public class FieldTest {
//打印出一个类里面的所有属性和属性修饰符,以及构造函数和构造函数的修饰符及参数,还有所有方法的修饰符和所有方法的名称及参数
public static void getField(Class c){
getParameter(c);
getConstruction(c);
getDeclaredFields(c);
}
//获取构造函数的所有内容
public static void getConstruction(Class c){
Constructor[] constructors=c.getDeclaredConstructors();
for (Constructor constructor : constructors) {
System.out.print(Modifier.toString(constructor.getModifiers())+" ");//后去构造函数的修饰符
System.out.print(constructor.getName()+"("); //获取构造函数的名称
Class[] p=constructor.getParameterTypes();
for(int k=0;k<p.length;k++){
System.out.print(p[k].getName()+" ");
}
System.out.println(" );");
}
}
//获取相应类的所有属性
public static void getParameter(Class c){
Field field[]=c.getDeclaredFields();
for (Field field1 : field) {
System.out.print(Modifier.toString(field1.getModifiers())+ " "); //修饰符
System.out.print(field1.getType()+" "+field1.getName()); //属性类型和属性名称
}
System.out.println("");
}
//获取相应类里面的所有申明的方法
public static void getDeclaredFields(Class c){
Method field[]=c.getDeclaredMethods();
for (Method method : field) {
System.out.print(Modifier.toString(method.getModifiers())+" "); //获取函数的修饰符权限
System.out.print(method.getReturnType()+" "+method.getName()+"("); //获取函数的名称
Class type[]= method.getParameterTypes();
for (Class aClass : type) {
System.out.print(aClass.getName()+" ");
}
System.out.println(");");
}
}
public static void main(String[] args) throws ClassNotFoundException {
System.out.println("获取类里面的所有信息");
String name="com.sise.lh.reflect.domain.Student";
Class c1=Class.forName(name);
System.out.println("class "+name+"\n{");
getField(c1);
System.out.println("}");
}
}
最后检测获取内容:
获取类里面的所有信息
class com.sise.lh.reflect.domain.Student
{
public int age
public com.sise.lh.reflect.domain.Student( );
public com.sise.lh.reflect.domain.Student(java.lang.String int );
public class java.lang.String test02();
public class java.lang.String test01();
public class java.lang.String test03();
public class java.lang.String test04();
}
class com.sise.lh.reflect.domain.Student
{
public int age
public com.sise.lh.reflect.domain.Student( );
public com.sise.lh.reflect.domain.Student(java.lang.String int );
public class java.lang.String test02();
public class java.lang.String test01();
public class java.lang.String test03();
public class java.lang.String test04();
}
虽然java的反射机制在web应用中出现的影子并不是很多,但是在商业的java组件里面的开发过程中,反射机制是众多流行框架实行的基础,其中就包括了spring,hibernate等