• Java SE之反射回顾


    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    /**
     * @author Kevin 2018-2-8
     * 
     * 
     * 
     * 看 tomcat源码发现,很多地方用到了反射,回顾一下Method的用法,及其参数的意义。
     * 
     * 反射的基本操作流程是:
     * 1.获取一个类加载器ClassLoader;
     * 2.获取Class的类信息,调用类加载器的loadClass方法,参数为String类型(全限定名);
     * 3.获取类实例;
     * 4.进行相关属性或者方法的操作。
     * 
     * Method对象,是对类方法的封装,调用用invoke方法
     *
     * Class.getMethod(String name, Class<?>... parameterTypes)
     *      --name:方法名称
     *      --参数列表,参数类型的class,如果没有参数的话就传null
     * 
     * Method.invoke(Object obj, Object... args) 
     *      --obj:调用方法的类的实例对象
     *      --args:n个参数,对应方法,如果没有参数传null
     */
    public class MethodDemo {
    
        public static void main(String[] args)  {
    
            try {
                ClassLoader cl = new MethodDemo().getClass().getClassLoader();
                Class<?> carclass = cl.loadClass("com.reflect.demo.Car");
    
                Object o = carclass.getConstructor().newInstance();
                Class<?>[] p = new Class<?>[1];
                p[0] = String.class;
                Method m = o.getClass().getMethod("setColor",p);
                m.invoke(o, "红色");
    
    
                Method m2 = o.getClass().getMethod("driver",null);
                m2.invoke(o, null);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            }
    
        }
    
    }
    public class Car {
    
        private String color;
    
    
        public String getColor() {
            return color;
        }
    
    
        public void setColor(String color) {
            this.color = color;
            System.out.println(color);
        }
    
    
        public void driver() {
            System.out.println("直行中......");
        }
    }

    下面来看一个Tomcat中随处可见的反射使用,如Bootstrap启动类的init方法中就反射生成了
    Catalina类,调用它的setParentClassLoader方法设置父类加载器:

    public void init() throws Exception {
    
            initClassLoaders();
    
            Thread.currentThread().setContextClassLoader(catalinaLoader);
    
            SecurityClassLoad.securityClassLoad(catalinaLoader);
    
            // Load our startup class and call its process() method
            if (log.isDebugEnabled())
                log.debug("Loading startup class");
            Class<?> startupClass = catalinaLoader.loadClass("org.apache.catalina.startup.Catalina");
            Object startupInstance = startupClass.getConstructor().newInstance();
    
            // Set the shared extensions class loader
            if (log.isDebugEnabled())
                log.debug("Setting startup class properties");
            String methodName = "setParentClassLoader";
            Class<?> paramTypes[] = new Class[1];
            paramTypes[0] = Class.forName("java.lang.ClassLoader");
            Object paramValues[] = new Object[1];
            paramValues[0] = sharedLoader;
            Method method =
                startupInstance.getClass().getMethod(methodName, paramTypes);
            method.invoke(startupInstance, paramValues);
    
            catalinaDaemon = startupInstance;
    
        }
  • 相关阅读:
    冰思《L.M》
    Delphi 基本语法与操作《转》
    ADO实现单条记录的刷新《转》
    js正则限制input框输入的常用代码《转》
    Delphi 获取汉字的拼音首字母《转》
    baby one more time
    邮件/域名/DNS相关知识
    Visual Studio 2005 正式版(RTM) BT下载地址
    经典爱情十句话
    Asp中使用存储过程代码收集
  • 原文地址:https://www.cnblogs.com/Kevin-1992/p/12608385.html
Copyright © 2020-2023  润新知