反射
反射是框架设计的灵魂,将类的各个组成部分封装为其他对象即是反射
反射的好处是:
1.可以在程序运行过程中操作类的组成部分对象
2.可以解耦,提高程序可扩展性
获取Class对象的三种方法
1.Class.forName(String name) 通过全类名获取Class对象 ,多用于配置文件中获取,
2.类名.class 通过类本身继承自Object类中的class属性来获取Class对象,多用于参数传递
3.对象.getClass() 通过定义于Object类的getClass()方法来获取,多用于获取字节码的方式
Class对象的功能:
一、获取成员变量
方法有:
Field[] getFields() 获取所有public修饰的成员变量
Field getField(String name) 获取指定的名称的public修饰的成员变量
Field[] getDeclaredFields() 获取所有的成员变量,不被修饰符所限制
Field getDeclaredField(String name) 获取指定的成员变量,在设置安全检查后可以读取此变量不管是否被private修饰
Field.Accessible(true) 暴力反射方法,即设置安全检查
Field.set(obj,value) 将obj对象的该属性值设置为value
二、获取构造器方法
方法有:
ConStructor<?>[] getConstructors()
ConStructor<T> getConstructor(类<?>...ParameterTypes)
ConStructor<T> getDeclaredConstructor(类<?>...ParameterTypes)
ConStructor<?>[] getDeclaredConstructors()
ConStructor.newInstance(value...parameterType) 使用Constructor创建对象
T.newInstance() 使用类继承自Object类中的静态方法直接构造类对象
三、获取成员方法
方法有:
Method[] getMethods()
Method getMethod(String name,类<?>...parameterTypes)
Method[] getDeclaredMethods()
Method getDeclaredMethod(String name,类<?>...parameterTypes)
Method.setAccessible(true)
Object invoke(obj,object...args) 执行方法
使用这些方法做“框架”:创建任意类的实例,并调用方法
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;
public class frameSelf {
public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
//创建属性集
Properties pro = new Properties();
//获取当前假框架类的类加载器
ClassLoader classLoader = frameSelf.class.getClassLoader();
//获取类加载器的资源获取的字节流
InputStream resourceAsStream = classLoader.getResourceAsStream("pro.properties");
pro.load(resourceAsStream); //让属性集加载流中的数据
// 获取className
String className = pro.getProperty("className");
//获取methodName
String methodName = pro.getProperty("methodName");
//将className加载到内存中
Class cls = Class.forName(className);
//创建对象
Object obj = cls.newInstance();
//获取方法
Method method = cls.getMethod(methodName);
//执行方法
method.invoke(obj);
}
}
以上就是本菜鸟所学习到的反射的基础内容,如有错误还请各位大佬多多指教