`
眼光独到
  • 浏览: 63473 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

浅谈JAVA反射机制

阅读更多

      JAVA反射机制可以从Class反射对象中获取构造函数,成员变量,方法类等类元素的反射对象,绕开语言访问检查可访问private的变量,同时可以在程序运行时对对象进行修改。反射技术是框架的核心基础技术之一。

     

package com.song.reflect;

public class PrivateCar {
 public PrivateCar(String color){
  this.color = color;
  System.out.println("调用了我的构造器,将color设置为:"+color);
 }
 private String color;
 protected void drive(){
  System.out.println("drive private car! the color is "+color);
 }
}

package com.song.reflect;

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

public class PrivateCarReflect {

 
 public static void main(String[] args) throws Exception {
  //得到类加载器
  ClassLoader loader = Thread.currentThread().getContextClassLoader();
  //通过全额限定名得到类反射的实例
  Class clazz = loader.loadClass("com.song.reflect.PrivateCar");
  //得到构造器
  Constructor cons = clazz.getDeclaredConstructor(String.class);
  //通过构造器实例化pcar
  PrivateCar pcar = (PrivateCar)cons.newInstance("黑色");
  
  //通过反射的实例得到要访问的private变量
  //Field colorFld = clazz.getField("color"); 不能使用该方法
  Field colorFld = clazz.getDeclaredField("color");
  //更改访问属性
  colorFld.setAccessible(true);
  colorFld.set(pcar, "红色");
  
  //通过反射的实例得到要访问的private方法
  Method driveMtd = clazz.getDeclaredMethod("drive", null);
  driveMtd.setAccessible(true);
  //执行,第一个参数为要执行该方法的对象名,第二个参数为参数列表
  driveMtd.invoke(pcar, null);
  
 }

}

 

Constructor :类的构造函数反射。通过Class.getConstructors()可以获得类的所有构造函数反射对象数组。还可以通过getConstructor(Class...parameterTypes)获取拥有特定入参的构造函数反射对象。通过newInstance(Object...initargs)创建一个对象的实例。

 

Method:类方法的反射类,通过Class.getDeclaredMethods()方法可以获取类的所有方法反射类对象数组

Method[],还可以通过getDeclaredMethod(String name,Class...parameterTypes)获取特定签名的方法,name为方法名,Class...为入参列表。  getReturnType()获取返回值类型, getParameterTypes()获取方法的入参类型数组, getExceptionType()获取方法的异常类型, getParameterAnnotations()获取方法的注释信息。

 

Field:类的成员变量的反射类。通过Class.getDeclareeFields()方法获取类成员变量反射对象数组,通过getDeclareField(String name)获取特定名称的成员变量反射对象。最主要方法有set(Object obj,Object value),obj为操作的目标对象,value为设定的值。还有类似setInt(Object obj,int value)这样带类型的设置方法。

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics