`
忘忧鸟
  • 浏览: 144792 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Java反射机制应用实例

    博客分类:
  • 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 j=0;j<pvec.length;j++){   
                System.out.println("parameter # "+j+" ="+pvec[j]);   
            }   
            //方法的异常   
            Class evec[] = m.getExceptionTypes();      
            for (int j = 0; j < evec.length; j++){   
                System.out.println("exception #" + j + " " + evec[j]);      
            }      
            //方法的返回类型   
            System.out.println("return type = " + mee.getReturnType());    
        }   
        System.out.println("---------------------------------------------------------------------");   
           
        /**  
         * //获取类的构造函数  
         */  
        Constructor ctorlist[] = c.getDeclaredConstructors();    
        for(int i=0;i<ctorlist.length;i++){   
            Constructor cons = ctorlist[i];   
            System.out.println("Constructor #"+i+" name="+cons.getName());   
            Class[] consParaType = cons.getParameterTypes();//获得构造函数的参数类型   
            if(consParaType.length==0){   
                System.out.println("Constructor have no parameters");   
            }else{   
                for(int j=0;j<consParaType.length;j++){   
                    System.out.println("Constructor Parameter type #"+j+" name="+consParaType[j]);   
                }   
            }   
        }   
        System.out.println("---------------------------------------------------------------------");   
           
        /**  
         * //获取类的属性  
         */  
        Field fieldlist[] = c.getDeclaredFields();      
        for(int i=0;i<fieldlist.length;i++){   
            Field field = fieldlist[i];   
            System.out.println("Filed #"+i+" name="+field.getName());//属性名称   
            System.out.println("Filed #"+i+" type="+field.getType());//属性类型   
               
            int mod = field.getModifiers();    
            System.out.println("modifiers = " + Modifier.toString(mod));//属性的修饰符 private/public/protected   
        }   
        System.out.println("---------------------------------------------------------------------");   
           
        /**  
         * //根据方法的名称来执行方法  
         */  
        Class cls = Class.forName("com.xtlh.sinye.Goods");      
        Class partypes[] = new Class[2];      
        partypes[0] = String.class;//更多类型 Long.TYPE Integer.TYPE,或者使用Long.class、Integer.class   
        partypes[1] = Class.forName("java.lang.String");      
        Method meth = cls.getMethod("addName", partypes);      
        Goods goods = new Goods();      
        Object arglist[] = new Object[2];      
        arglist[0] = new String("love");      
        arglist[1] = new String("grape");      
        Object retobj = meth.invoke(goods, arglist);      
        String retval = (String) retobj;      
        System.out.println(retval);    
        System.out.println("---------------------------------------------------------------------");   
           
        /**  
         * 创建对象,根据指定的参数类型找到相应的构造函数并执行它,以创建一个新的对象实例。使用这种方法可以在程序运行时动态地

创建对象,而不是在编译的时候创建对象,这一点非常有价值  
         */  
        Class clss = Class.forName("com.xtlh.sinye.Goods");      
        Class partypess[] = new Class[2];      
        partypess[0] = String.class;      
        partypess[1] = String.class;      
        Constructor ct = clss.getConstructor(partypess);      
        Object arglists[] = new Object[2];      
        arglists[0] = new String("hello");      
        arglists[1] = new String("orange");      
        Object retobjs = ct.newInstance(arglists);    
        System.out.println("---------------------------------------------------------------------");   
           
        /**  
         * //改变属性的值  
         */  
        Class ccc = Class.forName("com.xtlh.sinye.Goods");    
        Field fld = ccc.getDeclaredField("price");      
        Goods goods1 = new Goods();      
        System.out.println("price = " + goods1.price);      
        fld.setDouble(goods1, 25.0);      
        System.out.println("price = " + goods1.price);      
        System.out.println("---------------------------------------------------------------------");   
           
        /**  
         * //简单使用数组,创建了 10 个单位长度的 String 数组,为第 5 个位置的字符串赋了值,最后将这个字符串从数组中取得并打印

了出来  
         */  
        Class cla = Class.forName("java.lang.String");      
        Object arr = Array.newInstance(cla, 10);      
        Array.set(arr, 5, "hello Watermelon");      
        String s = (String) Array.get(arr, 5);      
        System.out.println(s);      
        System.out.println("---------------------------------------------------------------------");   
           
        /**  
         * //复杂数组使用,例中创建了一个 5 x 10 x 15 的整型数组,并为处于 [3][5][10] 的元素赋了值为 37。注意,多维数组实际上

就是数组的数组,例如,第一个 Array.get 之后,arrobj 是一个 10 x 15 的数组。进而取得其中的一个元素,即长度为 15 的数组,并使用 

Array.setInt 为它的第 10 个元素赋值。  
            注意创建数组时的类型是动态的,在编译时并不知道其类型。  
         */  
        int dims[] = new int[]{5, 10, 15};      
        Object array = Array.newInstance(Integer.TYPE, dims);      
        Object arrobj = Array.get(array, 3);      
        Class cl = arrobj.getClass().getComponentType();      
        System.out.println(cl);      
        arrobj = Array.get(arrobj, 5);      
        Array.setInt(arrobj, 10, 37);      
        int arrcast[][][] = (int[][][]) array;      
        System.out.println(arrcast[3][5][10]);      
    }   
  
} 
分享到:
评论

相关推荐

    Java反射机制经典案例

    Java反射机制是Java编程语言中的一个强大...通过以上介绍,我们了解了Java反射机制的基本概念、使用方法、应用场景以及需要注意的问题。在实际编程中,合理利用反射可以提高代码的灵活性,但同时也需注意其潜在的风险。

    Java 反射机制 代码的实例

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地获取类的信息并调用其方法,创建对象,访问私有成员,甚至改变类的行为。在深入...

    java反射机制应用

    ### Java反射机制应用详解 #### 一、Java反射机制简介 Java反射机制是Java语言提供的一种能在运行时分析类信息并动态操作对象的功能。通过反射,我们可以在程序运行期间获取类的信息(如类名、方法名等),创建...

    Java反射机制 Java反射机制

    Java反射机制的主要作用包括:获取类的所有属性和方法、构造动态实例、调用类的方法等。通过反射,程序可以动态地创建对象和调用其方法,从而实现更灵活的功能。 #### 二、Java反射机制的由来与发展 Java反射机制...

    反射实例-JAVA反射机制

    ### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...

    JAVA 反射机制应用

    Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是java.lang.Class,它代表了运行时的类信息。通过Class对象,我们...

    JAVA反射机制的入门代码

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...

    Java反射机制总结

    ### Java反射机制总结 #### 反射的概念与起源 反射的概念最早由Smith于1982年提出,指的是程序能够访问、检测并修改其自身状态或行为的能力。这一概念的提出迅速引起了计算机科学领域的广泛关注,并在之后的研究中...

    java的反射机制的应用实例

    以下是对Java反射机制应用实例的详细解释: 1. **获取类信息**:使用`Class`类的`forName()`方法可以获取到任何类的`Class`对象,例如`Class&lt;?&gt; clazz = Class.forName("全限定类名");`。这样我们就能获取到该类的...

    候捷谈Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...

    Java反射机制总结(实例分析)

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作。通过反射,开发者可以在程序执行时发现并访问类的字段(fields)、方法(methods)以及构造器(constructors),...

    Java反射机制学习(二)

    在"Java反射机制学习(二)"这篇博文中,作者可能详细解释了以上这些概念,并通过`BaseTest.java`和`Student.java`这两个示例文件进行了实例演示。`BaseTest.java`可能包含了一组基础的反射操作,而`Student.java`...

    java 反射机制详解

    Java 反射机制是 Java 语言中的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用对象的方法,甚至修改对象的状态。这一机制极大地增强了 Java 程序的灵活性和可扩展性,尤其是在...

    反射实例-JAVA反射机制.doc

    Java 反射机制详解 ...总结,Java 反射机制是一种强大的工具,能够提升程序的灵活性和可扩展性,但使用时应权衡其性能和安全性的影响。在实际开发中,应该谨慎地使用反射,并尽量将其限制在必要的场景。

    Java反射机制Demo

    虽然Java反射机制功能强大,但在实际开发中应谨慎使用,因为它可能破坏封装性,降低程序的可读性和可维护性,还可能带来安全性和性能问题。在非必要情况下,避免使用反射机制,优先考虑其他设计模式和编程技巧。 ...

    java的反射机制及其实际应用

    ### Java的反射机制及其实际应用 #### 一、引言 ...总之,Java反射机制是一项强大的工具,它能够在运行时动态地获取和操作类的信息。然而,应该谨慎使用反射,避免滥用造成不必要的性能损失或安全风险。

    北大青鸟java反射机制

    此外,Java反射机制也广泛应用于注解处理。`Annotation`接口代表了类、方法、字段等上的注解。我们可以使用`isAnnotationPresent(Class&lt;? extends Annotation&gt; annotationClass)`检查是否存在特定注解,`...

    一个例子让你了解Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类集中...在实践中学习,你会更好地理解Java反射机制的威力和应用场景。

Global site tag (gtag.js) - Google Analytics