学习笔记,记录一下今天的反射机制

反射是一个十分重要的知识点,在J2EE里框架的核心就是反射的知识,经常用Spring框架都把核心知识忘了,所以今天看了《java核心技术I》中关于反射的知识点,记录一下。

能够分析类能力的程序称为 反射(reflective)。

主要用途:

(1)在运行中分析类的能力

(2)在运行中查看对象

(3)实现通过的数组操作代码

(4)利用Method对象

利用反射分析类的能力:它可以检查类的结构。

主要有3个类:Field、Method和Constructor类。分别来描述类的域、方法和构造器。

直接上代码,这是一个可以显示一个类全部信息的程序。

package zjx.reflect;

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


public class ReflctionTest {
	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 (e.g. java.util.Date): ");
        name=in.next();
        }
        
        //打印类名和父类名字(如果不是Object类)
        try {
			Class cl=Class.forName(name);
			Class supercl=cl.getSuperclass();
			String modifiers=Modifier.toString(cl.getModifiers()); 
			if(modifiers.length()>0) System.out.print(modifiers+" ");
			System.out.print("class "+name);
			if(supercl != null&&supercl !=Object.class){
				System.out.print("extends "+supercl.getName());
			}
			System.out.print("\n{\n");
			printConstructors(cl);
			System.out.println();
			printMethods(cl);
			System.out.println();
			printFields(cl);
			System.out.println("}");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        System.exit(0);
	}
	
	
	/*
	  *打印类的所有构造器
	  *参数 cl 类
      */
	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(c.getModifiers());
			if(modifiers.length()>0)System.out.print(modifiers+"  ");
			System.out.print(name+"(");
			//打印参数类型
			Class[] paramTypes=c.getParameterTypes();
			for(int j=0;j<paramTypes.length;j++){
				if(j>0)System.out.print(",  ");
				System.out.print(paramTypes[j].getName());
			}
			System.out.println(");");
		}
	}
	
	/*
	 * 打印类的所有方法
	 * 参数为cl 类
	 * 
	 */
	public static void printMethods(Class cl){
		Method[] methods=cl.getDeclaredMethods();
		for(Method m:methods){
			Class retType=m.getReturnType();
			String name=m.getName();
			System.out.print("   ");
			//打印 修饰符 返还类型 和 方法名字
			String modifiers=Modifier.toString(m.getModifiers());
			if(modifiers.length()>0)System.out.print(modifiers+" ");
			System.out.print(retType.getName()+" "+name+"(");
			//打印参数类型
			Class[] paramTypes=m.getParameterTypes();
			for(int j=0;j<paramTypes.length;j++){
				if(j>0)System.out.print(",");
				System.out.print(paramTypes[j].getName());
			}
			System.out.println(");");
		}
	}
	/*
	 * 打印类的域
	 * 参数:cl类
	 * 
	 */
	public static void printFields(Class cl){
		Field[] fields=cl.getDeclaredFields();
		for(Field f:fields){
			Class type=f.getType();
			String name=f.getName();
			System.out.print("   ");
			String modifiers=Modifier.toString(f.getModifiers());
			if(modifiers.length()>0){
				System.out.print(modifiers+"  ");
			}
			System.out.println(type.getName()+" "+name+";");
		}
		
	}
	
	
}

程序运行结果:

Enter class name (e.g. java.util.Date): 
java.lang.Double


public final class java.lang.Doubleextends java.lang.Number
{
    public  java.lang.Double(double);
    public  java.lang.Double(java.lang.String);


   public boolean equals(java.lang.Object);
   public static java.lang.String toString(double);
   public java.lang.String toString();
   public int hashCode();
   public static int hashCode(double);
   public static double min(double,double);
   public static double max(double,double);
   public static native long doubleToRawLongBits(double);
   public static long doubleToLongBits(double);
   public static native double longBitsToDouble(long);
   public volatile int compareTo(java.lang.Object);
   public int compareTo(java.lang.Double);
   public byte byteValue();
   public short shortValue();
   public int intValue();
   public long longValue();
   public float floatValue();
   public double doubleValue();
   public static java.lang.Double valueOf(java.lang.String);
   public static java.lang.Double valueOf(double);
   public static java.lang.String toHexString(double);
   public static int compare(double,double);
   public static boolean isNaN(double);
   public boolean isNaN();
   public static boolean isFinite(double);
   public static boolean isInfinite(double);
   public boolean isInfinite();
   public static double sum(double,double);
   public static double parseDouble(java.lang.String);


   public static final  double POSITIVE_INFINITY;
   public static final  double NEGATIVE_INFINITY;
   public static final  double NaN;
   public static final  double MAX_VALUE;
   public static final  double MIN_NORMAL;
   public static final  double MIN_VALUE;
   public static final  int MAX_EXPONENT;
   public static final  int MIN_EXPONENT;
   public static final  int SIZE;
   public static final  int BYTES;
   public static final  java.lang.Class TYPE;
   private final  double value;
   private static final  long serialVersionUID;
}

输入了java.lang.Double类全名,然后程序分析了类的所有信息,打印了出来。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值