反射--笔记(第一篇)
直接代码理解
主要说明:反射的三种方式,反射方法。调用方法
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(); } }