zoukankan      html  css  js  c++  java
  • JAVA反射机制实例

    下面是Java常见的反射机制的实现。

    /**
    * 用于反射的类
    */
    public class Role { private String name = "默认的不带参数的构造函数"; private String type ="默认是public"; private static Role instance = null; //不带参数的 public Role() { } //带参数的 public Role(String name) { this.name = name; } //私有带参数的构造函数 private Role(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 Role getInstance() { if(instance == null) { instance = new Role("带参数的","俺是private"); } return instance; } public String getType() { return type; } private void setType(String type) { this.type = type; } }
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class RefletTest {
    
        /**
         * @param args
         * @throws ClassNotFoundException
         * @throws IllegalAccessException
         * @throws InstantiationException
         */
        public static void main(String[] args) throws ClassNotFoundException,
                InstantiationException, IllegalAccessException {
            // 反射例子1
            System.out.println();
            System.out.println("==========反射例子之1==========");
            Class<Role> cls1 = Role.class;
            // 只能反射默认的构造函数
            Role role1 = cls1.newInstance();
            role1.toString();
    
            // 反射的例子2
            System.out.println();
            System.out.println("==========反射例子之2==========");
            Class<Role> cls2 = (Class<Role>) Class.forName("nc.model.reflect.Role");
            // 只能反射默认的构造函数
            Role role2 = cls2.newInstance();
            role2.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<Role> constructor1 = cls2
                        .getConstructor(new Class[] { String.class });
                Role role3 = constructor1.newInstance("public型的带参数的");
                role3.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<Role> constructor2;
            Role role4 = null;
            try {
                constructor2 = cls2.getDeclaredConstructor(new Class[] { //只能使用getDecalredConstructor方法,而不能使用getConstructor
                        String.class, String.class });
                constructor2.setAccessible(true);// 设置访问权限,私有时,必须设
                role4 = constructor2.newInstance("带参数的", "private型的");
                role4.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(role2);// 参数是实例化的类
                Object object2 = field1.get(role4);// 参数是实例化的类
                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(role2, "私有的我也可以用");
                Method method2 = cls2.getMethod("getName", null);
                Object invoke = method2.invoke(role2, 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 Role) {
                    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();
            }
            
            
            //内部类神马的 ---后续加上
        }
    
    }
  • 相关阅读:
    封神台靶机练习第一章:SQL注入攻击原理
    java基础复习-自定义注解1(如何自定义注解?)
    java复习预科知识-Markdown学习
    leetcode-888-公平的糖果交换
    leetcode-884-两句话中的不常见单词
    leetcode-139-单词拆分(递归超时,动归解决)
    leetcode-134-加油站
    leetcode-91-解码方法(动态规划和递归两种解法)
    leetcode-56-合并区间
    leetcode-55-跳跃游戏
  • 原文地址:https://www.cnblogs.com/chenfei0801/p/3001050.html
Copyright © 2011-2022 走看看