zoukankan      html  css  js  c++  java
  • [Java] 反射机制 02

    反射

    1. 反射机制即指java可以在运行期间通过Class的Class Class.forName(String)方法动态地加载一个类
    2. 继而可以通过获得的该类对应的的Class对象的Object newInstance()方法实例化出该类的对象
    3. 然后可以通过Method[]  getMethods() 和Field[] getFields()等方法了解类的内部结构
    4. 最后就可以根据方法的内部结构决定该方法应该怎么样去调用,从而动态地去调用类的方法m.invoke(Object,Object... args)

    反射的例子:TestReflection.java

    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    
    public class TestRefection {
        public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
            String str = "T";
            Class c = Class.forName(str);
            p("-----------");
            Object o = c.newInstance();
            Method[] ms = c.getMethods();
            for (Method m : ms) {
                // p(m.getName());
                if (m.getName().equals("mm")) {
                    m.invoke(o, null);
                }
                if (m.getName().equals("m1")) {
                    m.invoke(o, 1, 2);
                    for (Class paramType : m.getParameterTypes()) {
                        p(paramType.getName());
                    }
                }
                if (m.getName().equals("getS")) {
                    Class returnType = m.getReturnType();
                    p(returnType.getName());
                }
            }
        }
        public static void p(Object o) {
            System.out.println(o);
        }
    }
    class T {
        static {
            System.out.println("T loaded!");
        }
        int i;
        String s;
        public T() {
            System.out.println("T constructed!");
        }
        public void mm() {
            System.out.println("mm invoked!");
        }
        public void m1(int i, int j) {
            this.i = i + j;
        }
        public String getS() {
            return s;
        }
    }
    输出 :
    T loaded!
    -----------
    T constructed!
    mm invoked!
    int
    int
    java.lang.String
    
    反射机制的好处在于可以使程序的可扩展性变的非常好;例如可以在配置文件里配置类名,然后在程序中动态的加载加载配置文件中指定的类并调用其方法,调方法之前还可以先检查这个人有没有这个权限,在Spring Hibernate transaction的处理以及面向切面的编程AOP中都大量用到了反射机制

  • 相关阅读:
    关于标准库中的ptr_fun/binary_function/bind1st/bind2nd
    ptr_fun学习笔记
    stream_iterator、ostream_iterator 使用初探
    C++异常处理
    ext2文件系统
    C语言动态内存管理
    C++中为什么要用虚函数、指针或引用才能实现多态?
    hadoop本地库
    二分图最小点覆盖König定理的简单证明 (加入自己理解)
    Fence Repair POJ
  • 原文地址:https://www.cnblogs.com/robbychan/p/3786559.html
Copyright © 2011-2022 走看看