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 = method.invoke(before); //获取改动之后的值 Object afterValue = method.invoke(vo); } } }


posted on 2017-04-26 18:31  ljbguanli  阅读(132)  评论(0编辑  收藏  举报