java反射机制

来源:互联网 发布:淘宝红灯牌收音机735b 编辑:程序博客网 时间:2024/06/08 19:16


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

      反射机制:所谓的反射机制就是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时才可以访问,默认为falsef.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====>1cl===>class java.lang.String获取反射类中所有的属性:fields1.length====>3cl1===>class java.lang.Stringcl1===>intcl1===>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的反射机制,理解的不是很深,有不对的地方还望各位不惜赐教!!!


9 0