首页 > 代码库 > java反射的使用

java反射的使用

Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
     下面介绍下java反射机制的使用
package cn.csdn.reflect;
import java.awt.Button;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.LinkedList;

public class ReflectClass {
	
	//参考地址    http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html
	
	public void geteClassBegin(){
		Demo demo = new Demo();
		System.out.println(demo.getClass().getSuperclass());
		
		String str = "23432";;
		System.out.println(str.getClass());  //  getClass java.lang.String          class   .getSuperclass() java.lang.Object
		
		Button b = new Button();
		System.out.println(b.getClass().getSuperclass().getSuperclass());
		
		System.out.println(Boolean.TYPE); 
		
		LinkedList linkedList = new LinkedList();
		System.out.println(linkedList.getClass().getSuperclass().getSuperclass().getSuperclass().getSuperclass());
		
		
	}
	
	//3种不同的方法获取类名 
	public void getClassMethod(){
		try {
			//鉴于使用这种方式
			Class<?> demo = Class.forName("cn.csdn.reflect.Demo");
			System.out.println(demo.getName());
			
			Class<?> demo1 = Demo.class;
			System.out.println(demo1.getName());
			
			Class<?> demo2 = new Demo().getClass();
			System.out.println(demo2.getName());
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	//通过无参构造实例化对象   -- Demo
	public void getNewClass(){
		try {
			Class<?> clas = Class.forName("cn.csdn.reflect.Demo");
			Demo demo = (Demo)clas.newInstance();
			demo.setAddress("黑悲伤");
			demo.setEmail("sdfdsf@qq.com");
			System.out.println(demo.toString());
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
	
	
	//获取类中所有的构造函数  --Demo1
	public void getConstructor() throws Exception{
		Class<?> clas = Class.forName("cn.csdn.reflect.Demo1");
		Constructor<?> cons[] = clas.getConstructors();
		for(Constructor<?> con:cons){
			System.out.println(con); 
		}
	}
	
	
	//class 获取一个类的全部框架 ---- Demo1的属性   本类属性的获取和父类的所有public的获取
	public void getClassAll() throws Exception{
		Class<?> clas = Class.forName("cn.csdn.reflect.Demo1");
		//获取Demo1的全部属性及类型
		
		// getDeclaredFields  获取这个类的所有属性字段 包括 private  public  proteced
		Field[] fields = clas.getDeclaredFields();
		for(Field field:fields){
			//System.out.println(field);
			int modifier = field.getModifiers();
			String str = Modifier.toString(modifier);
			//输出值如:    private  java.lang.Integer  id
			System.out.println(str+"========="+field.getType().getName()+"======"+field.getName());
		}
		
		
		//getFields  获取  本类及父类的所有public的方法   只有public的方法
		Field[] fields1 = clas.getFields();
		for(Field field:fields1){
			System.out.println(field); 
			int mo = field.getModifiers();
			String str = Modifier.toString(mo);
			System.out.println(str+" "+field.getType().getName()+" "+field.getName());
		}
	}
	
	
	
	//通过反射调用其他类中的方法
	public void getMethod() throws Exception{ 
		Class<?> clas = Class.forName("cn.csdn.reflect.Demo1");
		//调用Demo1类中的方法 hello
		Method method = clas.getMethod("hello");
		//对方法进行实例化
		method.invoke(clas.newInstance());
		
	}
	
	
	//调用get set 方法
	public void getSetMethod() throws Exception{
		Class<?> clas = Class.forName("cn.csdn.reflect.Demo1");
		Object obj = clas.newInstance();

		Method method = clas.getMethod("getId");
		System.out.println(method.invoke(obj));
		
	}
	//通过反射操作属性  给属性设置值 如果此属性是私有的,则必须加上setAccessible  如果为共有的  则不用考虑
	public void getOperateAttribute() throws Exception{
		Class<?> clas = Class.forName("cn.csdn.reflect.Demo1");
		Object obj = clas.newInstance();
		
		Field field = clas.getDeclaredField("name");
		//此属性为私有变量的时候必须要做此操作	 才可以通过访问,否则会报错  java.lang.IllegalAccessException: Class cn.csdn.reflect.ReflectClass can not access a member of class cn.csdn.reflect.Demo1 with modifiers "private"
		field.setAccessible(true);
		field.set(obj,"张三");
		System.out.println(field.get(obj)); 
		
		//输出结果:张三
	}
	
	
	//通过反射类中的Array可以得到数据的信息并可以修改数组的大小
	public void getArrayAttribute() throws Exception{
		int[] array = {1,2,3,4,5};
		Class<?> demo = array.getClass().getComponentType();
		System.out.println("数组的类型:"+demo.getName()+"====数组的长度:"+Array.getLength(array)+"=获取数组的第一个元素="+Array.get(array, 0)); 
		Array.set(array,0,100);
		System.out.println(Array.get(array, 0));
		
		//输出结果:
		//数组的类型:int====数组的长度:5=获取数组的第一个元素=1
		//100
		
	}
	
	//修改数组的大小 Array.newInstance()方法
	public void getArrayLength() throws Exception{
		int[] array={1,2,3,4,5,6,7,8,9};
		//修改数组大小之前的循环输出
		for(int i = 0;i<Array.getLength(array);i++){
			if(i==(Array.getLength(array)-1)){
				System.out.println();
			}else{
				System.out.print(Array.get(array, i)+" ");
			}
		}
		// 输出  1 2 3 4 5 6 7 8 
		
		Class<?> demo = array.getClass().getComponentType();
		Object arrayNew = Array.newInstance(demo, 15);
		int length = Array.getLength(array);
		//System.arraycopy()实现数组之间的复制
		//arraycopy(Object src, int srcPos, Object dest, int destPos, int length)  src:源数组   srcPos:源数字开始复制的位置 
		//dest 目的数组 (arrayNew)    destPos:目的数组存在的起始位置    length是复制的长度
		System.arraycopy(array, 0, arrayNew, 0, length);
		System.out.println("修改之后的长度为==="+Array.getLength(arrayNew));//15
		
		for(int i = 0;i<Array.getLength(arrayNew);i++){
			System.out.print(Array.get(arrayNew, i)+" ");
		}
		
		//1 2 3 4 5 6 7 8 9 0 0 0 0 0 0 
	}
	
	
	//通过反射得到实体类对应的值
	public void getValue() throws Exception{
		//getFields  获取  本类及父类的所有public的方法   只有public的方法
		// field.get()可以得到对应的实体类中的值
		Class<?> clas = Class.forName("cn.csdn.reflect.Demo1");
		Demo1 demo = (Demo1) clas.newInstance();
		demo.setAddress("2332");
		demo.setEmail("342");
		Field[] fields1 = clas.getFields();
		for(Field field:fields1){
			int mo = field.getModifiers();
			String str = Modifier.toString(mo);
			System.out.println(str+" "+field.getType().getName()+" "+field.getName()+"=="+field.get(demo));
		}
		
		//输出结果:
		/*
		 *  public java.lang.String phone==null
			public java.lang.String address==2332
			public java.lang.String email==342
		 */
		
	}
	
	
	public void getCase() throws Exception{
		//实例介绍  当想要同时获取一个对象在修改前和修改后的值的时候,可用到反射
		Demo before = null; //获取修改前的对象
		Demo1 vo = null;//获取修改之后的对象
		Class beforeClazz = before.getClass();
		Method[] beforeMethods = beforeClazz.getMethods();
		for (Method method : beforeMethods) {
			//通过之前的对象获取对应的值
			Object beforeValue = http://www.mamicode.com/method.invoke(before);>