反射
1. 利用 forName() 方法进行 Class 类对象取得, 其最大的特征是可以在类不存在的时候保持程序编译的正确性
例:
Class<?> cls = Class.forName("com.zhc.main.Person");
2. 利用 newInstance() 方法可以实例化对象
例:
Object obj = cls.newInstance();
3. 使用反射时,类里面必须有一个无参的构造方法.(JAVA 类必须要提供有无参构造)
4. getName(),会取得完整的类名称(包.类)
getSimplename(),只取得类名称(没有包名称)
5. Method[] getMethods() 取得全部方法
Method getMethod(String name,Class<?>... parameterTypes) // 获取公共的方法
以上的两个方法里面返回的都是 java.lang.reflect.Method
Method getDeclaredMethod("xxx"); // 获取任意的方法(xxx:方法名)
Method 类里面最重要的方法是:
invoke(Object obj,Object... args) 调用指定的方法并且 Method 对象的 invoke 是有返回值的,
它的返回值就是目标方法执行的返回值
若是私有的方法,必须使用 setAccessible(true) 让该方法可以访问
任何方法调用时都必须有实例化对象,而后再设置参数;
在整个 Method 类里面最为重要的操作方法只有一个: invoke(), 这个是可以直接反射调用方法.
反射调用
一个类必须在有一个实例化对象的情况下才能够调用类中的普通方法
例:
Class<?> cls = Class.forName("com.zhc.main.Person");
Object obj = cls.newInstance(); // 实例化对象
Method metA = cls.getMethod("setName", String.class); // setName()
Method metB = cls.getMethod("getName"); // getName()
metA.invoke(obj, "奔驰狗"); // setter 方法没有返回值
System.out.println(metB.invoke(obj));
1. 利用 forName() 方法进行 Class 类对象取得, 其最大的特征是可以在类不存在的时候保持程序编译的正确性
例:
Class<?> cls = Class.forName("com.zhc.main.Person");
2. 利用 newInstance() 方法可以实例化对象
例:
Object obj = cls.newInstance();
3. 使用反射时,类里面必须有一个无参的构造方法.(JAVA 类必须要提供有无参构造)
4. getName(),会取得完整的类名称(包.类)
getSimplename(),只取得类名称(没有包名称)
5. Method[] getMethods() 取得全部方法
Method getMethod(String name,Class<?>... parameterTypes) // 获取公共的方法
以上的两个方法里面返回的都是 java.lang.reflect.Method
Method getDeclaredMethod("xxx"); // 获取任意的方法(xxx:方法名)
Method 类里面最重要的方法是:
invoke(Object obj,Object... args) 调用指定的方法并且 Method 对象的 invoke 是有返回值的,
它的返回值就是目标方法执行的返回值
若是私有的方法,必须使用 setAccessible(true) 让该方法可以访问
任何方法调用时都必须有实例化对象,而后再设置参数;
在整个 Method 类里面最为重要的操作方法只有一个: invoke(), 这个是可以直接反射调用方法.
反射调用
一个类必须在有一个实例化对象的情况下才能够调用类中的普通方法
例:
Class<?> cls = Class.forName("com.zhc.main.Person");
Object obj = cls.newInstance(); // 实例化对象
Method metA = cls.getMethod("setName", String.class); // setName()
Method metB = cls.getMethod("getName"); // getName()
metA.invoke(obj, "奔驰狗"); // setter 方法没有返回值
System.out.println(metB.invoke(obj));