JAVA反射机制实例

package net.cmono.reflect;
public class RoleModel {
        private String name = "默认的不带参数的构造函数";
                          
        private String type ="默认是public";
                          
        private static RoleModel instance  = null;
                          
                          
        //不带参数的
        public RoleModel() {
        }
                          
        //带参数的
        public RoleModel(String name) {
            this.name = name;
        }
                          
        //私有带参数的构造函数
        private RoleModel(String name,String type) {
            this.name = name;
            this.type = type;
        }
        private void setName(String name) {
            this.name = name;
        }
        public String getName() {
            return name;
        }
                          
        @Override
        public String toString() {
            System.out.println(getName()+":"+getType());
            return this.getName();
        }
                          
        public synchronized static RoleModel getInstance() {
            if(instance == null) {
                instance = new RoleModel("带参数的","俺是private");
            }
            return instance;
        }
        public String getType() {
            return type;
        }
        private void setType(String type) {
            this.type = type;
        }
}

package net.cmono.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test {
    /**
     * @param args
     * @throws IllegalAccessException
     * @throws InstantiationException
     * @throws ClassNotFoundException
     */
    public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        // TODO Auto-generated method stub
        // 反射例子1
        System.out.println();
        System.out.println("==========反射例子之1==========");
        Class<RoleModel> cls1 = RoleModel.class;
        // 只能反射默认的构造函数
        RoleModel Model1 = cls1.newInstance();
        Model1.toString();
        // 反射的例子2
        System.out.println();
        System.out.println("==========反射例子之2==========");
        Class<RoleModel> cls2 = (Class<RoleModel>) Class.forName("net.cmono.reflect.RoleModel");
        // 只能反射默认的构造函数
        RoleModel Model2 = cls2.newInstance();
        Model2.toString();
        // 反射的例子3 获取类的构造器
        /**
         * public Constructor<?>[] getConstructors()
         * 返回类中所有的public构造器集合,默认构造器的下标为0 public Constructor<T>
         * getConstructor(Class<?>... parameterTypes) 返回指定public构造器,参数为构造器参数类型集合
         * public Constructor<?>[] getDeclaredConstructors() 返回类中所有的构造器,包括私有
         * public Constructor<T> getDeclaredConstructor(Class<?>...
         * parameterTypes) 返回任意指定的构造器
         */
        System.out.println();
        System.out.println("==========反射例子之3==========");
        // 先看看public
        try {
            Constructor<RoleModel> constructor1 = cls2
                    .getConstructor(new Class[] { String.class });
            RoleModel Model3 = constructor1.newInstance("public型的带参数的");
            Model3.toString();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        System.out.println();
        System.out.println("==========反射例子之4==========");
        Constructor<RoleModel> constructor2;
        RoleModel Model4 = null;
        try {
            constructor2 = cls2.getDeclaredConstructor(new Class[] {
                    String.class, String.class });
            constructor2.setAccessible(true);// 设置访问权限,私有时,必须设
            Model4 = constructor2.newInstance("带参数的", "private型的");
            Model4.toString();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 反射例子5 获取类的成员变量
        /**
         *   了解了构造器,其实你可以猜到成员变量的获取方法了,成员变量用Field类进行封装。 主要的方法非常的类似: public Field
         * getDeclaredField(String name) 获取任意指定名字的成员 public Field[]
         * getDeclaredFields() 获取所有的成员变量 public Field getField(String name)
         * 获取任意public成员变量 public Field[] getFields() 获取所有的public成员变量
         */
        try {
            Field field1 = cls2.getDeclaredField("type");// 参数是字段名
            field1.setAccessible(true);
            Object object1 = field1.get(Model2);// 参数是实例化的类
            Object object2 = field1.get(Model4);// 参数是实例化的类
            System.out.println("=========反射例子之5===========");
            System.out.println(object1);
            System.out.println(object2);
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 反射例子6 方法 --方法
        /**
         * public Method[] getMethods() 获取所有的公有方法的集合 public Method
         * getMethod(String name,Class<?>... parameterTypes) 获取指定公有方法 参数1:方法名
         * 参数2:参数类型集合 public Method[] getDeclaredMethods() 获取所有的方法 public Method
         * getDeclaredMethod(String name,Class<?>... parameterTypes) 获取任意指定方法
         * 无参的时候我们只要传null就行了。
         */
        try {
            Method method1 = cls2.getDeclaredMethod("setName",
                    new Class[] { String.class });
            method1.setAccessible(true);
            method1.invoke(Model2, "私有的我也可以用");
            Method method2 = cls2.getMethod("getName", null);
            Object invoke = method2.invoke(Model2, null);// 非静态方法第一个参数 不能为空
            System.out.println("==========反射例子之6==========");
            System.out.println(invoke);
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }// 无参的时候我们只要传null就行了。
        catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 反射例子7 方法 --静态方法和字段,
        Method method3;
        try {
            method3 = cls2.getDeclaredMethod("getInstance", null);
            method3.setAccessible(true);
            Object invoke = method3.invoke(null, null);// 记住与普通方法不同,第一个参数是null(不过貌似不为空,好像也没事)
            if (invoke instanceof RoleModel) {
                System.out.println("实例化成功");
            }
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

点击查看原图

知识共享许可协议
《JAVA反射机制实例》常伟华 创作。
采用 知识共享 署名-相同方式共享 3.0 中国大陆 许可协议进行许可。
  • 多说评论
  • 签名
  • 新浪微博
  • 默认评论
  • Tab Header 5

0 条评论 / 点击此处发表评论

Tab Content 5

开发技术


开发平台和工具

sitemap     150.15ms