反射

来源:互联网 发布:java dos 命令 编辑:程序博客网 时间:2024/05/17 03:55

基础:

实现反射的基础类:

  • Class类:代表一个类。(核心)
  • Field 类:代表类的成员变量(成员变量也称为类的属性)。
  • Method类:代表类的方法。
  • Constructor 类:代表类的构造方法。
  • Array类:提供了动态创建数组,以及访问数组的元素的静态方法
  • Proxy类以及InvocationHandler接口:提供了动态生成代理类以及实例的方法

Class类的方法有:

  • getName():获得类的完整名字(包括包名字)
  • getFields():获得类的public类型的属性
  • getDeclaredFields():获得类的所有属性(包括private,protected等)
  • getMethods():获得类的public类型的方法
  • getDeclaredMethods():获得类的所有方法
  • getMethod(String name, Class[]
    parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型
  • getConstructors():获得类的public类型的构造方法
  • getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes参数指定构造方法的参数类型
  • newInstance():通过类的不带参数的构造方法创建这个类的一个对象

反射之基本方法:

这块代码请从下往上看,为了调试,本人都注释了,自己搞一下~)

 public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException, NoSuchFieldException {        /**         * 反射机制的动态代理         */        //这边再说        /**         * 通过反射机制操作某个类的属性         *///        Class<?> class1 = Class.forName("ModelC");//        Object obj = class1.newInstance();//        // 可以直接对 private 的属性赋值//        Field field = class1.getDeclaredField("name");//         //设置些属性是可以访问的//        field.setAccessible(true);//        field.set(obj, "老王");//        System.out.println(field.get(obj));        /**         * 通过反射机制调用某个类的方法         *///        Class<?> class1 = Class.forName("ModelC");//        Method method3  = class1.getMethod("say");//        method3.invoke(class1.newInstance());////        Method method  = class1.getMethod("daYin",  String.class);//        method.invoke(class1.newInstance(), "hahahaha");////        Method method2  = class1.getMethod("jiafa",  int.class,  int.class);//        method2.invoke(class1.newInstance(), 1,2);        /**         * 获得类的全部方法         *///        Class<?> class1 = Class.forName("ModelC");//        Method[] methods = class1.getMethods();//        for(int i = 0; i<methods.length;i++){//            Class<?> returnType = methods[i].getReturnType();//            Class<?> para[] = methods[i].getParameterTypes();//            int temp = methods[i].getModifiers();//            System.out.print(Modifier.toString(temp) + " ");//            System.out.print(returnType.getName() + "  ");//            System.out.print(methods[i].getName() + " ");//            System.out.print("(");//            for (int j = 0; j < para.length; ++j) {//                System.out.print(para[j].getName() + " " + "arg" + j);//                if (j < para.length - 1) {//                    System.out.print(",");//                }//            }//            Class<?> exce[] = methods[i].getExceptionTypes();//            if (exce.length > 0) {//                System.out.print(") throws ");//                for (int k = 0; k < exce.length; ++k) {//                    System.out.print(exce[k].getName() + " ");//                    if (k < exce.length - 1) {//                        System.out.print(",");//                    }//                }//            } else {//                System.out.print(")");//            }//            System.out.println();//        }        /**         * 获得类的全部属性         *///        Class<?> class1 = Class.forName("ModelC");////        Field[] fields = class1.getDeclaredFields();//        for(int i=0;i<fields.length;i++){//            //获取权限修饰符//            int mo = fields[i].getModifiers();//            String priv = Modifier.toString(mo);//            Class<?> type = fields[i].getType();//            System.out.println(priv+" "+type.getName()+" "+fields[i].getName());//        }        /**         * 获得父类,或者接口的属性         *///        Class<?> class1 = Class.forName("ModelC");//        Field[] fields = class1.getFields();//        for(int i=0;i<fields.length;i++){//            //获取权限修饰符//            int mo = fields[i].getModifiers();//            String priv = Modifier.toString(mo);//            Class<?> type = fields[i].getType();//            System.out.println(priv+" "+type.getName()+" "+fields[i].getName());//        }        /**         * 获得类构造方法,通过构造方法建对象         *///        Class<?> class1 = Class.forName("ModelC");//        System.out.println(class1.getName());//        ModelC modelC = (ModelC)class1.newInstance();//        modelC.setName("fw");//        modelC.setAge(13);//        System.out.println(modelC.toString());////        Constructor<?> constructors[] = class1.getConstructors();//        ModelC modelC2 = (ModelC)constructors[1].newInstance("fw2");//        System.out.println("modelC2:"+modelC2.toString());//        for(int i=0; i<constructors.length; i++){//            Class<?> clazzs[] = constructors[i].getParameterTypes();//            for (int j = 0; j < clazzs.length; j++) {//                if (j == clazzs.length - 1)//                    System.out.print(clazzs[j].getName());//                else//                    System.out.print(clazzs[j].getName() + ",");//            }//            System.out.println(")");//        }        /**         * 获得接口         *///        Class<?> class1 = Class.forName("Adapter.PlayGanmes");//        Class<?> intf[] = class1.getInterfaces();//        for(int i = 0 ; i<intf.length;i++){//            System.out.println(intf[i].getName());//        }        /**         * 获得父类         *///        Class<?>  class1 = Class.forName("Bridge.Black");//        Class<?> class2 = class1.getSuperclass();//        System.out.print(class2.getName());    }

引用到的两个类:

public class ModelC extends Father{    private String name;    private int age;    public ModelC(){        super();    }    public  ModelC(String name){        this.name = name;    }    public  ModelC(String name,int age){        this.name = name;        this.age = age;    }    public void say(){        System.out.println("hello");    }    public void daYin(String oo){        System.out.println(oo);    }    public void jiafa(int a1,int a2){        System.out.println(a1+a2);    }    private void method1(){        System.out.println(this.name+","+this.age);    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String toString(){        return "[name:"+this.name+", age:"+age+"]";    }}
public class Father {    public String sex;    public String getSex() {        return sex;    }    public void setSex(String sex) {        this.sex = sex;    }}

反射之应用:

  /**     * 在泛型为Integer的ArrayList中存放一个String类型的对象。     */    public void method1() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {        ArrayList<Integer> arrayList = new ArrayList<Integer>();        //获得方法        Method method = arrayList.getClass().getMethod("add",Object.class);        //发送存放请求        method.invoke(arrayList,"我是一个String");        System.out.print(arrayList.get(0));    }    /**     *通过反射取得并修改数组的信息     */    public void method2(){        int[] temp = {1,2,3,4,5};        //获取数据的类型        Class<?> demo = temp.getClass().getComponentType();        System.out.println("数组类型: " + demo.getName());        System.out.println("数组长度  " + Array.getLength(temp));        System.out.println("数组的第一个元素: " + Array.get(temp, 0));        Array.set(temp, 0, 100);        System.out.println("修改之后数组第一个元素为: " + Array.get(temp, 0));    }    /**     *通过反射机制修改数组的大小     * @param obj   int[] temp = {1,2,3,4,5};     * @param len  10     * @return     */    public Object method3(Object obj,int len){        Class<?> arr = obj.getClass().getComponentType();        Object newArr = Array.newInstance(arr,len);        System.arraycopy(obj, 0, newArr, 0, Array.getLength(obj));       // 打印出来看一看        for (int i = 0; i < Array.getLength(newArr); i++) {            System.out.print(Array.get(newArr, i) + " ");        }        return newArr;    }
0 0
原创粉丝点击