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