package com.niu.demo.ReflectTest;
import java.util.*;
import java.lang.reflect.*;
public class ReflectTest{
private static Double a = 100.1;
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:");
//name = in.nextLine();
}
try{
//Class cl =Class.forName(name);
//获取属性a的Class
Class cl = a.getClass();
//获取父类的Class
Class supercl = cl.getSuperclass();
//获取类的修饰符
String modifiers = Modifier.toString(cl.getModifiers());
if(modifiers.length()>0){
System.out.print(modifiers + " ");
}
//System.out.print("class " + name);
System.out.print("class " + cl.getName());
if(supercl!=null && supercl !=Object.class){
System.out.print(" extends " + supercl.getName());
}
System.out.print("\n{\n");
printFields(cl);
System.out.println();
printConstructors(cl);
System.out.println();
printMethods(cl);
System.out.print("}");
}catch(Exception e){
e.printStackTrace();
}
}
public static void printConstructors(Class cl){
Constructor[] constructors = cl.getDeclaredConstructors();
for(Constructor c : constructors){
String name = c.getName();
System.out.print(" ");
String modifiers = Modifier.toString(cl.getModifiers());
if(modifiers.length()>0){
System.out.print(name + " (");
}
Class[] parameterTypes = c.getParameterTypes();
for(int j =0;j<parameterTypes.length;j++){
if(j>0){
System.out.print(" , ");
}
System.out.print(parameterTypes[j].getName());
}
System.out.println(");");
}
}
public static void printMethods(Class cl){
Method[] methods = cl.getDeclaredMethods();
for(Method m : methods){
Class retType = m.getReturnType();
String name = m.getName();
String modifiers = Modifier.toString(m.getModifiers());
System.out.print(" ");
if(modifiers.length() > 0){
System.out.print(modifiers+" ");
}
System.out.print(retType.getName()+" "+name+"(");
Class[] parameterTypes = m.getParameterTypes();
for(int i = 0;i<parameterTypes.length;i++){
if(i > 0){
System.out.print(" , ");
}
System.out.print(parameterTypes[i].getName());
}
System.out.println(")");
}
}
public static void printFields(Class cl) throws IllegalAccessException{
Field[] fields = cl.getDeclaredFields();
for(Field f:fields){
String modifiers = Modifier.toString(cl.getModifiers()) ;
if(modifiers.length() > 0){
//覆盖java默认的权限设置,可以直接访问private修饰的属性或者方法
f.setAccessible(true);
//x.get(Object y)获取x在y对象中的值
System.out.println(" "+modifiers+" "+f.getName()+" = "+f.get(a));
if(f.getName().equals("value")){
//x.set(Object obj,Object value);
//设置对象obj中x的值为value
f.set(a,999.9);
System.out.println("===================================");
System.out.println("此属性修改过 ======> "+modifiers+" "+f.getName()+" = "+f.get(a));
System.out.println("===================================");
}
}
}
}
}