Vincent的专栏

liuxiaohua

Java反射机制

 
Java反射机制
一.有没有这样一种方式,让我们不知道这个类的类名就可以实例化它的对象呢?
Thank Goodness! 幸亏我们用的是java,java就提供了这样的一种机制。反射机制。
 
二.什么叫反射机制?
   1. java程序在运行时可以获得任何一个类的字节码信息,包括类的修饰符(public,static等),基类(超类,父类),实现的接口,字段和方法等信息。
   2. java程序在运行时可以根据字节码信息来创建该类的实例对象,改变对象的字段内容和调用对象方法.这种机制就叫反射技术。
 
三.反射机制介绍。
Java的反射机制是通过反射API来实现的,它允许程序在运行过程中取得任何一个已知名称的类的内部信息.反射API位于java.lang.reflect包中.主要包括以下几类:
         1).Constructor类:用来描述一个类的构造方法
        2).Field类:用来描述一个类的成员变量
        3).Method类:用来描述一个类的方法.
        4).Modifer类:用来描述类内各元素的修饰符
        5).Array:用来对数组进行操作.
 
获取类的构造方法的Constructor对象(数组)
    Constructor[] getDeclaredConstructors();返回已加载类声明的所有的构造方法的Constructor对象数组.
    Constructor getDeclaredConstructor(Class[] paramTypes);返回已加载类声明的指定构造方法的Constructor对象,paramTypes指定了参数类型.
    Constructor[] getConstructors();返回已加载类声明的所有的public类型的构造方法的Constructor对象数组.
    Constructor getConstructor(Class[] paramTypes);返回已加载类声明的指定的public类型的构造方法的Constructor对象,paramTypes指定了参数类型.
如果某个类中没有定义构造方法,第一个和第三个方法返回的数组中只有一个元素,就是缺省的构造方法;如果某个类中只定义了有参数的构造函数,而没有定义缺省构造函数,第一个和第三个方法返回的数组中不包含缺省的构造方法.
 
例子:
package com.vincent.test;
import java.lang.reflect.*;
public class DumpMethods {
    
public static void main(String[] args) {
        
try {
            
if (args.length < 1) {
                System.out.println(
"请输入完整的类名:");
                
return;
            }
            Class strClass 
= Class.forName(args[0]);
            
//检索带有指定参数的构造方法
            Class[] strArgsClass = new Class[]{byte[].class, String.class};
            Constructor constructor 
= strClass.getConstructor(strArgsClass);
            System.out.println(
"Constructor:" + constructor.toString());
            
//调用带有参数的构造方法创建实例对象object
            byte[] bytes = "IT年薪".getBytes();
            Object[] strArgs 
= new Object[]{bytes, "GBK"};
            Object object 
= constructor.newInstance(strArgs);
            System.out.println(
"Object" + object.toString());
        } 
catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

  Field[] getDeclaredFields():返回已加载类声明的所有成员变量的Field对象数组,不包括从父类继承的成员变量.

  Field getDeclaredField(String name):返回已加载类声明的所有成员变量的Field对象,不包括从父类继承的成员变量,参数name指定成员变量的名称.

   Field[] getFields():返回已加载类声明的所有public型的成员变量的Field对象数组,包括从父类继承的成员变量
   Field getField(String name):返回已加载类声明的所有成员变量的Field对象,包括从父类继承的成员变量,参数name指定成员变量的名称.
例子:
package com.vincent.test
import java.lang.reflect.*;
public class ReflectTest {
        
private String name;
        
private String passwd;
        
public ReflectTest(String name,String passwd){
               
this.name=name;
               
this.passwd=passwd;
        }
 
        
public static void main(String[] args) { 
             
try{
                  ReflectTest rt
=new ReflectTest("Vincent","spring");
                  fun(rt);
             }
catch(Exception e){
                     e.printStackTrace();
             }
       }
        
public static void fun(Object obj) throws Exception{
               Field[] fields
=obj.getClass().getDeclaredFields();
               System.out.println(
"修改之前的值:"); 
               
for(Field field:fields){
                    System.out.println(field.getName()
+"="+field.get(obj)); 
                   
if(field.getType().equals(java.lang.String.class)){
                         
//必须设置为true才可以修改成员变量
                         field.setAccessible(true);                             String org=(String)field.get(obj);
                         field.set(obj,org.replaceAll(
"g","a"));
                   }
         }
         System.out.println(
"修改之后的值:");
         
for(Field field:fields){
                System.out.println(field.getName()
+"="+field.get(obj)); 
         }
      }
}

 

获取类的方法的Method对象(数组)
    Method[] getDeclaredMethods():返回已加载类声明的所有方法的Method对象数组,不包括从父类继承的方法.
    Method getDeclaredMethod(String name,Class[] paramTypes):返回已加载类声明的所有方法的Method对象,不包括从父类继承的方法,参数name指定方法的名称,参数paramTypes指定方法的参数类型.
   Method[] getMethods():返回已加载类声明的所有方法的Method对象数组,包括从父类继承的方法.
   Method getMethod(String name,Class[] paramTypes):返回已加载类声明的所有方法的Method对象,包括从父类继承的方法,参数name指定方法的名称,参数paramTypes指定方法的参数类型.
 
 
检索类的其他信息
   int   getModifiers():返回已加载类的修饰符的整形标识值.
   Package getPackage():返回已加载类的包名
   Class   getSuperclass():返回已加载类的父类的Class实例.
   Class []   getInterfaces():返回已加载类实现的接口的Class对象数组.
   boolean isInterface():返回已加载类是否是接口.
 
注意:反射的功能很强大,但是使用不当可能会缺点大于优点,反射使代码逻辑混乱,会带来维护的问题。
阅读更多
个人分类: Java
想对作者说点什么? 我来说一句

Java反射机制 Java反射机制

2008年12月28日 20KB 下载

java反射机制与动态代理

2010年03月28日 250KB 下载

Java反射机制课件ppt

2010年06月28日 268KB 下载

JAVA 反射机制应用

2008年10月17日 124KB 下载

java反射原理

2011年07月04日 450KB 下载

java反射机制教程

2009年07月24日 202KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭