什么是反射?
凡是是将类的各个组成部分封装为其他对象
反射好处:
1. 可在程序运行过程中,操作这些对象
2. 可以解耦,提高程序的可扩展性
获取class对象的方法:
1. Class.forName(“全类名”)
2. 类名.class 通过类名的属性class获取
3. 对象.getClass(); getClass()方法在object中定于着
以上三种方法:
第一种,多用于配置文件,将类名定义在配置文件中,读取文件,加载类
第二种,多用于参数的传递
第三种,多用于对象的获取字节码方式
获取功能:
1. 获取成员变量们
Field[] getFields():获取所有public修饰的成员变量
Field getField(String name):获取指定名称的public修饰的成员变量
Field[] getDeclaredFields():获取所有成员变量,不考虑修饰符
Field getDeclaredField(String name):获取指定名称的成员变量,不考虑修饰符
但是!!!
Declared访问私有,会报异常。所以要忽略权限修饰符的安全检查
declaredField.setAccessible(true):称之为,暴力反射
2. 获取构造方法们,和成员方法们,的方法同上
public class A {
// 成员变量
public String str;
int num;
// 构造方法
public A() {}
public A(int m) { }
// 成员方法
private void func1() {}
private void func2() {}
public static void main(String[] args) throws Exception {
Class classInfo = Class.forName("com.reflect.testPackage1.A");
// Class classInfo = A.class; // 两种获取class的方法都可以,效果一样
System.out.println("********************************成员变量************************************************");
System.out.println("A 的Fields变量如下。。。");
for(Field field : classInfo.getFields()) {
System.out.println(field.toString());
}
System.out.println("A 的DeclaredFields变量如下。。。");
for(Field declaredFields : classInfo.getDeclaredFields()) {
System.out.println(declaredFields.toString());
}
System.out.println("=============================我是华丽的分割线=====================================");
System.out.println("********************************构造方法************************************************");
System.out.println("A 的Constructor变量如下。。。");
for(Constructor constructor : classInfo.getConstructors()) {
System.out.println(constructor.toString());
}
System.out.println("A 的DeclaredConstructors变量如下。。。");
for(Constructor declaredConstructor : classInfo.getDeclaredConstructors()) {
System.out.println(declaredConstructor.toString());
}
System.out.println("=============================我是华丽的分割线=====================================");
System.out.println("********************************成员方法************************************************");
System.out.println("A 的Method变量如下。。。");
for(Method method : classInfo.getMethods()) {
System.out.println(method.toString());
}
System.out.println("A 的DeclaredMethod变量如下。。。");
for(Method declaredMethod : classInfo.getDeclaredMethods()) {
declaredMethod.setAccessible(true);
System.out.println(declaredMethod.toString());
System.out.println("=============================我是华丽的分割线分割线=====================================");
System.out.println("********************************暴力反射************************************************");
declaredMethod.setAccessible(false);
System.out.println(declaredMethod.toString());
}
}
}