反射--笔记(第一篇)

直接代码理解

主要说明:反射的三种方式,反射方法。调用方法

public static void main(String[] args) throws Exception {
        getClassWays();
        Product product = (Product) Main.generateObj("demo.reflection.Product");
        product.doStr();
        System.out.println(product);

        Class clz = Product.class;
        //Declare:声明,因为一个类的方法可以简单的分为
        //自己写的(Declare)和父类继承过来的
        //getDeclareMethods是得到自己声明的所有方法
        Method[] declaredMethods = clz.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod.getName());
        }

        //得到某一个具体方法。
        //得到某一个具体的方法,传递的参数,第一个是方法的名字
        //第二个是方法的参数类型,有多少个就传递多少个。如果没有就不用写。
        //为啥这样设计,是因为java语言有重载这种技术
        Method doStr = clz.getDeclaredMethod("doStr",String.class);
        //invoke:调用,方法的调用分为实例方法的调用和静态方法的调用
        //因为现在得到的是一个实例方法,所以需要传递对象
        //invoke方法的第一个参数就是对象,第二个参数就是方法的一系列的参数值
        doStr.invoke(product,"你好");
        System.out.println(doStr);
    }
    public static Object generateObj(String className) throws Exception {
        //这种创建方法,能成功的前提是此类有一个默认构造函数
        //不然会有异常:NoSuchMethodException
        Class clz = Class.forName(className);
        Object instance = clz.newInstance();
        return instance;
    }
    public static void getClassWays() throws Exception{
        //第一种方法是,依据类来得到其class对象
        Class c1= Product.class;

        //第二种:利用forName方法加载类,并返回类对象
        //如果此类已经被加载过,就不会重复加载
        Class c2 = Class.forName("demo.reflection.Product");

        //第三种方法:依据类的对象得到其类对象
        Product p = new Product();
        Class c3 = p.getClass();
    }
}

 

posted @ 2019-08-19 16:29  不希望有明天  阅读(162)  评论(4编辑  收藏  举报