当前位置:编程学习 > JAVA >>

JAVA反射机制及应用例子

JAVA 反射机制是Java 被视为动态(或准动态)语言的一个关键性质。这个机制允许程式在运行时通过Reflection APIs 取得任何一个已知名称的class 的内部资讯,包括其modifiers(诸如public, private,static 等等)、superclass(例如Object)、interfaces(例如Cloneable),也包括fields 和methods 的所有资讯, 并在运行时调用任意一个对象的方法;生成动态代理。下面以一段代码来看一下主要的Reflection APIs,代码中有相应的注释。
 
Java代码 
import java.lang.reflect.Array; 
import java.lang.reflect.Constructor; 
import java.lang.reflect.Field; 
import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 
import java.lang.reflect.Modifier; 
 
public class Goods 

    private String id; 
    private double price; 
 
    public Goods(){ 
        System.out.println("it is a pen"); 
    } 
     
    public Goods(String s1,String s2){ 
        System.out.println(s1+"*"+s2); 
    } 
     
    public String getId() 
    { 
        System.out.println(id); 
        return id; 
    } 
    public void setId(String id) 
    { 
        this.id = id; 
    } 
    public String addName(String str1,String str2){ 
        return str1+str2; 
    } 
    /**
     * @throws ClassNotFoundException 
     * @throws IllegalAccessException 
     * @throws InstantiationException 
     * @throws NoSuchMethodException 
     * @throws SecurityException 
     * @throws InvocationTargetException 
     * @throws IllegalArgumentException 
     * @throws NoSuchFieldException 
     * @功能描述  
     * @输入参数  
     * @反馈值    
     */ 
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException 
    { 
        // TODO Auto-generated method stub 
        String str = "com.xtlh.sinye.Goods"; 
        Class c = Class.forName(str); 
        Object obj = c.newInstance();//初始化一个Goods的对象 
         
        /**
         * //这里设置属性的值 调用setId()方法,类型用Class[],参数用Object[]
         */ 
        Method m = c.getMethod("setId",new Class[]{Class.forName("java.lang.String")});  
        m.invoke(obj,new Object[]{"it's apple"});  
        System.out.println("---------------------------------------------------------------------"); 
         
        /**
         * //这里是里获取属性的值 调用getId()方法
         */ 
        m = c.getMethod("getId",new Class[]{});  
        m.invoke(obj,new Object []{});  
        System.out.println("---------------------------------------------------------------------"); 
         
        /**
         * //获得类中声明的方法
         */ 
        Method me[] = c.getDeclaredMethods();  
        for(int i=0;i<me.length;i++){ 
            System.out.println("method["+i+"]="+me[i].toString()); 
        } 
        System.out.println("---------------------------------------------------------------------"); 
         
        /**
         * //模拟 instanceof 操作符
         */ 
        boolean b1 = c.isInstance(new Integer(34)); 
        System.out.println("Goods is a instance of Integer ? "+b1); 
        boolean b2 = c.isInstance(new Goods());//这里调用了无参的构造方法 
        System.out.println("Goods is a instance of Goods ? "+b2); 
        System.out.println("---------------------------------------------------------------------"); 
         
        /**
         * //找出类的方法,类的名称,类的方法的参数,类的方法的返回类型
         */ 
        Method med[] = c.getDeclaredMethods();  
        Method med1[] = c.getMethods();//从字面意思可以看出来,这里找到所有的方法,即可以找到继承来的方法等 
        for(int i=0;i<med.length;i++){ 
            Method mee = med[i]; 
            System.out.println("method # "+i+" name="+mee.getName()); 
            System.out.println("declaring class ="+mee.getDeclaringClass()); 
            //方法的参数类型 
            Class pvec[] = m.getParameterTypes(); 
            for(int

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,