java反射 统一形式调用 class,Field, Constructor, Method

什么是反射?
凡是是将类的各个组成部分封装为其他对象

反射好处:
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());
}

}
}

发布了5 篇原创文章 · 获赞 0 · 访问量 43

猜你喜欢

转载自blog.csdn.net/hello_momo/article/details/105366431