zoukankan      html  css  js  c++  java
  • 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;
    
        }
  • 相关阅读:
    Session的使用与Session的生命周期
    Long-Polling, Websockets, SSE(Server-Sent Event), WebRTC 之间的区别与使用
    十九、详述 IntelliJ IDEA 之 添加 jar 包
    十八、IntelliJ IDEA 常用快捷键 之 Windows 版
    十七、IntelliJ IDEA 中的 Maven 项目初体验及搭建 Spring MVC 框架
    十六、详述 IntelliJ IDEA 创建 Maven 项目及设置 java 源目录的方法
    十五、详述 IntelliJ IDEA 插件的安装及使用方法
    十四、详述 IntelliJ IDEA 提交代码前的 Code Analysis 机制
    十三、IntelliJ IDEA 中的版本控制介绍(下)
    十二、IntelliJ IDEA 中的版本控制介绍(中)
  • 原文地址:https://www.cnblogs.com/Kevin-1992/p/12608385.html
Copyright © 2011-2022 走看看