反射

来源:互联网 发布:centos7 pdo mysql 编辑:程序博客网 时间:2024/06/06 01:00
---------------------- android培训、java培训、期待与您交流! ----------------------

.什么是java反射机制?

java反射机制事java程序开发语言的特征之一,在Java运行时环境中,对于任意一个类,都可以知道这个类有哪些属性和方法,对于任意一个对象,都可以调用它的任意一个方法。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java语言的反射(Reflection)机制。

.java反射的应用

java反射机制主要应用在一些工具可视化的操作软件组件上,通过在运行动态的获取用户信息,动态的创建对象

.JAVA反射机制提供的功能

在运行时判断任意一个对象所属的类

在运行时构造任意一个类的对象

在运行时判段任意一个类所具有的成员变量和方法

在运行时调用任一个对象的方法

在运行时创建新类对象

在使用Java的反射功能时,基本首先都要获取类的Class对象,再通过Class对象获取其他的对象

 

 

 

下面是实例代码和说明

1.    得到某个对象的属性
    
publicObject getProperty(Object owner, String fieldName) throws Exception {
    ClassownerClass = owner.getClass();
3     Field field =ownerClass.getField(fieldName);
    Objectproperty = field.get(owner);
    returnproperty;
   }
Class ownerClass = owner.getClass():得到该对象的Class
Field field = ownerClass.getField(fieldName)
:通过Class得到类声明的属性。
Object property = field.get(owner)
:通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException
2. 
得到某个类的静态属性
    
publicObject getStaticProperty(String className, String fieldName)
            throws Exception {
    ClassownerClass = Class.forName(className);
    Fieldfield = ownerClass.getField(fieldName);
    Objectproperty = field.get(ownerClass);
    return property;
7 }
Class ownerClass = Class.forName(className) :首先得到这个类的Class
Field field = ownerClass.getField(fieldName)
:和上面一样,通过Class得到类声明的属性。
Object property = field.get(ownerClass)
:这里和上面有些不同,因为该属性是静态的,所以直接从类的Class里取。
3. 
执行某对象的方法
    
publicObject invokeMethod(Object owner, String methodName, Object[] args) throwsException {
2     Class ownerClass =owner.getClass();
    Class[]argsClass = new Class[args.length];
    for (int i = 0, j = args.length;i < j; i++) {
    argsClass[i]= args[i].getClass();
    }
    Method method =ownerClass.getMethod(methodName, argsClass);
    return method.invoke(owner,args);   
9}
Class owner_class = owner.getClass() :首先还是必须得到这个对象的Class
5
9行:配置参数的Class数组,作为寻找Method的条件。
Method method = ownerClass.getMethod(methodName, argsClass)
:通过Method名和参数的Class数组得到要执行的Method
method.invoke(owner, args)
:执行该 Methodinvoke方法的参数是执行这个方法的对象,和参数数组。返回值是Object,也既是该方法的返回值。
4. 
执行某个类的静态方法
    
publicObject invokeStaticMethod(String className, String methodName,
            Object[] args) throws Exception {
    ClassownerClass = Class.forName(className);
    Class[] argsClass = newClass[args.length];
    for(int i = 0, j = args.length; i < j; i++) {
    argsClass[i]= args[i].getClass();
    }
    Methodmethod = ownerClass.getMethod(methodName, argsClass);    
    returnmethod.invoke(null, args);
10  }
基本的原理和实例3相同,不同点是最后一行,invoke的一个参数是null,因为这是静态方法,不需要借助实例运行。
5. 
新建实例
    
publicObject newInstance(String className, Object[] args) throws Exception {
    ClassnewoneClass = Class.forName(className);
    Class[]argsClass = new Class[args.length];
4     for (int i = 0, j = args.length;i < j; i++) {
    argsClass[i] =args[i].getClass();
 }
    Constructorcons = newoneClass.getConstructor(argsClass);
    returncons.newInstance(args);  
  }
这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数,可以直接使用newoneClass.newInstance()来实现。
Class newoneClass = Class.forName(className)
:第一步,得到要构造的实例的Class
5~第9行:得到参数的Class数组。
Constructor cons = newoneClass.getConstructor(argsClass)
:得到构造子。
cons.newInstance(args)
:新建实例。
6. 
判断是否为某个类的实例
 
public booleanisInstance(Object obj, Class cls) {
    returncls.isInstance(obj);
3 }
7. 得到数组中的某个元素
 
public ObjectgetByArray(Object array, int index) {
    returnArray.get(array,index);

反射也就是说,在编译时,你获取了一个指向某个并不存在你的程序空间中的对象的引用;事实上在编译时你的程序无法获知这个对象所属的类 
  
java附带的库java.lang.reflect包含了FIeld,Method,Constructor.这些类型的对象是由jvm在运行时创建的,用以表示未知类里对应的成员.你就可以使用Constructor创建新的对象,get()set()方法读取和修改与Field对象关联的字段,invoke()方法调用与Method对象关联的方法。他的去翻一下jdk文档吧 
  
1Constructor   getConstructor(Class[]   params)获得使用特殊的参数类型的公共构造函数。        

     Constructor[]   getConstructors()获得类的所有公共构造函数 

     Constructor   getDeclaredConstructor(Class[]   params)获得使用特定参数类型的构造函数(与接入级别无关    

     Constructor[]   getDeclaredConstructors()获得类的所有构造函数(与接入级别无关   
  
2.   
     Field   getField(String   name)获得命名的公共字段     
  
   Field[]   getFields() 获得类的所有公共字段     
     
Field   getDeclaredField(String   name)获得类声明的命名的字段     
  
   Field[]   getDeclaredFields()获得类声明的所有字段    
  
3.   
     Method   getMethod(String   name,   Class[]   params)使用特定的参数类型,获得命名的公共方法     
     
Method[]   getMethods() 获得类的所有公共方法     
  
   Method   getDeclaredMethod(String   name,   Class[]   params)使用特写的参数类型,获得类声明的命名的方法     
Method[]   
getDeclaredMethods()获得类声明的所有方法   

 

---------------------- android培训、java培训、期待与您交流! ----------------------
原创粉丝点击