JAVA新手入门手稿——通过反射分析类的结构

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("===================================");
					}
				}
			}
	}
	
}

猜你喜欢

转载自blog.csdn.net/GeekYoung/article/details/80341497