获得Class对象方法
Class.forName("全类名")
Class cls = Class.forName("cn.itcast.domain.Person");
类名.class
Class cls = Person.class;
对象.getClass()
Person p = new Person(); Class cls = p.getClass();
所得Class是字节码文件
Class对象的相关方法
- 获取成员变量
-
Field[] getFields()
只能获取public成员变量的一个数组 -
Field[] getDeclaredFields()
获取所有成员变量个一个数组 -
Field getField(String name)
只能获取public成员变量的一个Field对象 -
Field getDeclaredField(String name)
能获取所有类型的成员变量的一个Field对象 -
获取Field对象之后的操作
- 设置值
void set(Object obj, Object value)
- 获得值
get(Object obj)
obj是类对象 - 忽略访问修饰符的安全权限检查
setAccessible(true or false)
暴力反射
- 代码
==首先获得class对象== (Person 是个类,里面有public成员变量a) Class cls = Person.class; ==然后获得Field对象== Field field = cls.getField("a");//field是一个Field对象 ==创建Person对象然后获得value== Person p = new Person;//创建一个Person对象 ==获得成员变量a的值== Object value = a.get(p); ==设置成员变量a的值== a.set(p,"张三");
-
- 获取构造器
Constructor[] getConstructors()
Constructor getConstructor(类<?>...parameterType)
Constructor[] getDeclaredConstructors()
Constructor getDeclaredConstructor(类<?>...parameterType)
- 获得Constructor对象后的操作
Object newInstance()
创建类对象
- 获得构造器的目的创建类对象
- 代码
==先获得class对象== Class cls = Person.class; ==获得构造器对象== Constructor constructor = cls.getConstructor(String.class,int.class); //getConstructor所获得的是类的某一个构造函数,所以要指定参数类型以指定 ==创建类对象== Object personInstance = constructor.newInstance("张三",23);
如果是要使用类的无参构造方法,可以直接对Class对象使用
newInstance()
,不用再创建Constructor对象
- 获取成员方法
Method[] getMethods();
Method getMethod(方法名,类<?> parameterType)
根据一个方法的名称和参数类型可以确定某个方法Method[] getDeclaredMethods();
Method getDeclaredMethod(方法名,类<?>parameterType)
- 获得Method对象之后的操作
- 执行方法
invoke(Object obj)
- 获得方法的名称
getName()
- 执行方法
- 代码
==Person类中有一个方法== void eat(String food){System.out.println("吃"+food); ==获取Class对象== Class cls = Person.class; ==获取Method对象== Method method = cls.getMethod("eat",String.class); ==获得一个类对象==//至于为什么每次都要获得一个类对象来运行是因为规定吧 Person p = new Person(); ==执行method== method.invoke(p); ==获得方法的名称== String methodName = method.getName();
反射案例(框架)
- 反射的运行需要配置文件的协同
- 首先书写pro.property配置文件
className = 全类; classMethod = 方法名;
- 加载以及使用
==创建Property对象(是Map的子类,内容为键值对,唯一与IO流有关的集合)== Property pro = new Property(); ==使用Property的load方法加载配置文件之前需要找到配置文件路径== //获得当下Java文件的类加载器 ClassLoader classLoader = 当前java类名.class.getClassLoader(); //从类加载器获得配置文件的输入流 InputStream is = classLoader.getResourceAsStream("配置文件名"); ==使用Property的load方法加载配置文件== pro.load(is); //现在pro里面装载了键值对 ==获取pro里的键值信息然后使用== String className = pro.getProperty("className"); String methodName = pro.getProperty("methodName"); ==使用信息访问类并且运用类=== Class cls = className.class; Method method = cls.getMethod(methodName); Object obj = cls.newInstance(); //无参构造 method.invoke(obj); //执行方法
- 首先书写pro.property配置文件