Java反射
Java反射
反射:框架设计的灵魂
框架:半成品,可以在框架的基础上进行软件开发,简化编码
反射:将类的各个组成部分封装为其他的对象,这就是反射机制
好处:
1.可以在程序的运行过程中,操作这些对象
2.可以解耦,提高程序的可拓展性
下面我们用一张图来讲述java的反射机制
由图可见将类的各个组成部分封装为一个个对象,成员变量封装为field对象,构造方法封装为con对象,成员方法封装围为method对象
获取Clss对象的三种方式
- Class.forName("全类名"):将字节码文件加载进内存,返回Class对象
* 多用于配置文件,将类名定义在配置文件中。读取文件,加载类 - 类名.class:通过类名的属性class获取
* 多用于参数的传递 - 对象.getClass():getClass()方法在Object类中定义着。
* 多用于对象的获取字节码的方式
代码
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
Class<?> person = Class.forName("Reflect.Person");
System.out.println(person);
Class<Person> personClass = Person.class;
System.out.println(personClass);
Person person1 = new Person();
Class<? extends Person> aClass = person1.getClass();
System.out.println(aClass);
}
}
结果
可见一个类,在一次运行过程中只会被加载一次
那么class对象有什么用呢?
获取功能:
1. 获取成员变量们
* Field[] getFields() :获取所有public修饰的成员变量
* Field getField(String name) 获取指定名称的 public修饰的成员变量
* Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符
* Field getDeclaredField(String name)
package Reflect;
import java.lang.reflect.Field;
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
//获取class对象
Class<Person> personClass = Person.class;
//使用getFields方法获取public修饰的方法
Field[] fields = personClass.getFields();
System.out.println("getFields方法:");
//获取public修饰的成员变量
for (Field field : fields) {
System.out.println(field);
}
System.out.println("getDeclaredFields方法:");
//使用getDeclareFields方法获取全部成员变量
Field[] declaredFields = personClass.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
}
}
结果:
2. 获取构造方法们
* Constructor<?>[] getConstructors()
* Constructor<T> getConstructor(类<?>... parameterTypes)
* Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
* Constructor<?>[] getDeclaredConstructors()
package Reflect;
import java.lang.reflect.Constructor;
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
//获取class对象
Class<Person> personClass = Person.class;
//获取public 修饰的构造方法
Constructor<?>[] constructors = personClass.getConstructors();
System.out.println("Public修饰的构造方法:");
for (Constructor<?> constructor : constructors) {
System.out.println(constructor);
}
//获取所有构造方法
System.out.println("所有构造方法:");
Constructor<?>[] declaredConstructors = personClass.getDeclaredConstructors();
for (Constructor<?> declaredConstructor : declaredConstructors) {
System.out.println(declaredConstructor);
}
}
}
结果:
3. 获取成员方法们:
* Method[] getMethods()
* Method getMethod(String name, 类<?>... parameterTypes)
* Method[] getDeclaredMethods()
* Method getDeclaredMethod(String name, 类<?>... parameterTypes)
4. 获取全类名
* String getName()
*
package Reflect;
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
//获取class对象
Class<Person> personClass = Person.class;
//获取全类名
String name = personClass.getName();
System.out.println(name);
}
}
结果
Field:成员变量
* 操作:
1. 设置值
* void set(Object obj, Object value)
2. 获取值
* get(Object obj)
3. 忽略访问权限修饰符的安全检查
* setAccessible(true):暴力反射
Constructor:构造方法
创建对象:
* T newInstance(Object... initargs)
* 如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法
package Reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Main {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//获取class对象
Class<Person> personClass = Person.class;
Person person = new Person();
Constructor<Person> one = personClass.getConstructor(String.class, int.class);
System.out.println(one);
//构造方法1
System.out.println("构造方法1:");
Person zhangsan = one.newInstance("zhangsan", 11);
System.out.println(zhangsan);
System.out.println("构造方法2:");
Person person2 = personClass.newInstance();
System.out.println(person2);
}
}
结果
Method:方法对象
执行方法:
Object invoke(Object obj, Object... args)
获取方法名称:
String getName:获取方法名
以上就是java反射的一些基础知识,如有错误还请各位批评指正,喜欢我的可以点赞收藏,也可以关注呀