`

java反射

阅读更多
   Java语言允许通过程序化的方式间接对class进行操作,Class文件由类装载器装载后,在JVM中形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等。Java允许用户借由有这个Class相关的元信息对象间接调用Class对象的功能,这就为使用程序化方式操作Class对象开辟了途径。
public  class ReflectTest{
         ublic static Car  initByDefaultConst() throws Throwable 
    { 
        //①通过类装载器获取Car类对象 
        ClassLoader loader = Thread.currentThread().getContextClassLoader();  
        Class clazz = loader.loadClass(类的包的全名);
          //②获取类的默认构造器对象并通过它实例化Car 
        Constructor cons = clazz.getDeclaredConstructor((Class[])null);  
        Car car = (Car)cons.newInstance();      
          //③通过反射方法设置属性 
        Method setBrand = clazz.getMethod("setBrand",String.class);         
        setBrand.invoke(car,"红旗CA72");       
        Method setColor = clazz.getMethod("setColor",String.class); 
        setColor.invoke(car,"黑色");       
        Method setMaxSpeed = clazz.getMethod("setMaxSpeed",int.class); 
        setMaxSpeed.invoke(car,200);         
        return car; 
    } 
}
在ReflectTest中,使用了几个重要的反射类,分别ClassLoader,Class,Constructor和Method,通过这些反射类就可以间接调用目标Class的各项功能。在1处,我们获取当前线程
的ClassLoader,然后通过指定的全权限定类,装载Car类对应的反射实例。在2处,我们通过
Car的反射类对象获取Car的构造函数对象,通过构造函数对象的newInstance()方法实例化Car对象,效果相当于new Car().在3处,我们通过Car的反射类对象的getMethod(String,methodName,Class paramClass)获取属性的Setter方法对象,第一个参数是目标Class的方法名;第二个参数是方法中要添加的对象类型。获取方法反射对象后,即可通过Invoke(Object obj,Object param)方法调用目标类的方法,该方法的第一个参数是操作的目标类对象实例;第二个参数是目标方法的入参。
  Java反射涉及到以下三个反射类:
1、Constructor:类的构造函数反射类,通过getConstructors()方法可以获得所用构造函数反射对象数组。在JDK5.0中,还可以通过getConstructor(Class ...parameterType)获取拥有特定入参的构造函数反射对象。
2、Method:类方法的反射类,通过class的getDeclaredMethods()方法可以获得所用方法反射类的对象组。
3、Field:类的成员变量的反射类,通过Class#getDeclaredFields()方法可以获取的成员变量反射对象数组,通过Class#getDeclaredField(String name)则可以获取某个特定名称的成员变量反射对象。
在访问private、protected成员变量和方法时必须通过setAccessible(boolean access)方法取消Java语言检查,否则将抛出IllegalAccessException。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics