java反射机制



      引言:最近无意中在项目中看到了使用反射机制的代码,好奇心顿起,于是在网上找了些资料学习了下...

      反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力。通过这种能力可以彻底的了解自身的情况为下一步的动作做准备。   

      Java的反射机制的实现要借助于4个类:class,Constructor,Field,Method;其中class代表的时类对 象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象。通过这四个对象我们可以粗略的看到一个类的各个组成部分。
     Java反射机制主要提供了以下功能:在运行时判定任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判定任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。hibernate的延迟载入,spring的AOP都是这么实现的.

 下面我们来看看具体的代码实现:

实体类:Simple

package test;

public class Simple {
	public String a = "zwm";
	protected int m = 2;
	private int i = 1;
	public Simple(){
	  }
   public Simple(String s){
	  this.a=s;
  }
	protected void print(String str, int i) {
		System.out.println(i + "--测试---" + str);
	}
	private void print1(String str ) {
		System.out.println("测试---" + str);
	}
}


测试类:testFs

package test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class testFs {
	public static void main(String[] args) throws ClassNotFoundException,
			SecurityException, NoSuchMethodException, InstantiationException,
			IllegalAccessException, IllegalArgumentException,
			InvocationTargetException, NoSuchFieldException {
		Class<?> simpleClass = Class.forName("test.Simple");
		Object simpelObject = simpleClass.newInstance();
		//getFields()、getDeclaredFields(),它们分别是用来获取反射类中所有公有
		//属性和反射类中所有的属性的方法
		Field[] fields=simpleClass.getFields();//获取反射类中所有公有属性
		System.out.println("获取反射类中所有公有属性:");
		System.out.println("fields.length====>"+fields.length);
		for (int i = 0; i < fields.length; i++) {
			Class<?> cl=fields[i].getType();
			System.out.println("cl===>"+cl);
		}
		Field[] fields1=simpleClass.getDeclaredFields();//获取反射类中所有的属性
		System.out.println("获取反射类中所有的属性:");
		System.out.println("fields1.length====>"+fields1.length);
		for (int i = 0; i < fields1.length; i++) {
			Class<?> cl1=fields1[i].getType();
			System.out.println("cl1===>"+cl1);
		}
		
		Field f = simpleClass.getDeclaredField("i");//获取反射类中私有的属性
		//setAccessible方法,它是用来设置是否有权限访问反射类中的私有属性的,只有设置为true时才可以访问,默认为false
		f.setAccessible(true);    
		Integer i = (Integer)f.get(new Simple());
		System.out.println("获取反射类中私有的属:");
        System.out.println("i====>"+i);
        String className = simpleClass.getName(); //获取指定类的类名    
        Constructor[] constructors = simpleClass.getConstructors();//获取指定类的构造方法   
        System.out.println("获取指定类的构造方法:");
        for ( int  m= 0 ; m<constructors.length; m++) {    
        Class[] parameterTypes = constructors[m].getParameterTypes();//获取指定构造方法的参数的集合
        System.out.print(className + "(" );    
        for ( int  j= 0 ; j<parameterTypes.length; j++)    
        System.out.print(parameterTypes[j].getName() + " " );    
        System.out.println(")" );    
           
        }   

        Method[] Methods= simpleClass.getDeclaredMethods();
        System.out.println("获取指定类的所有方法");
        for (int j = 0; j < Methods.length; j++) {
        	//输出方法的返回类型     
        	System.out.print(Methods[j].getReturnType().getName());   
        	//输出方法名     
        	System.out.print(" " +Methods[j].getName()+ "(" );    
        	//获取方法的参数     
        	Class[] parameterTypes = Methods[j].getParameterTypes();   
        	for ( int  k= 0 ; k<parameterTypes.length; k++){    
        	System.out.print(parameterTypes[k].getName());   
        	if (parameterTypes.length>k+ 1 ){    
        	System.out.print("," );    
        	}   
        	}   
        	System.out.println(")" );   
		}
        
        
		Class[] args1 = new Class[2];
		args1[0] = String.class;//对应方法的参数类型
		args1[1] = int.class;//对应方法的参数类型
		Method simpleMethod = simpleClass.getDeclaredMethod("print",
				args1);
		Object[] argments = new Object[2];//参数值
		argments[0] = "Hello,Reflection!!!";
		argments[1] = 2;
		simpleMethod.invoke(simpelObject, argments);//方法调用

		
		Class[] args2 = new Class[1];
		args2[0] = String.class;//对应方法的参数类型
		Method simpleMethod1 = simpleClass.getDeclaredMethod("print1",
				args2);
		//setAccessible方法,它是用来设置是否有权限访问反射类中的私有方法的,只有设置为true时才可以访问,默认为false
	    simpleMethod1.setAccessible(true);
	    String[] argments1 = new String[1];//参数值
		argments1[0] = "Hello,Reflection!!!";
		simpleMethod1.invoke(simpelObject, argments1);//方法调用
	}
}


输出结果:

获取反射类中所有公有属性:
fields.length====>1
cl===>class java.lang.String
获取反射类中所有的属性:
fields1.length====>3
cl1===>class java.lang.String
cl1===>int
cl1===>int
获取反射类中私有的属:
i====>1
获取指定类的构造方法:
test.Simple()
test.Simple(java.lang.String )
获取指定类的所有方法
void print1(java.lang.String)
void print(java.lang.String,int)
2--测试---Hello,Reflection!!!
测试---Hello,Reflection!!!

  初次接触java的反射机制,理解的不是很深,有不对的地方还望各位不惜赐教!!!



java反射机制

上一篇:动态菊花效果---- UIActivityIndicatorView微型化视图的使用


下一篇:延迟加载技术总结