反射-getFields和getDeclaredFields的区别

先创建一个类

public class Person {
	
	private String name;
	public int age;
	
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	private Person() {
		super();
	}
	
	private Person(int age) {
		super();
		this.age = age;
	}
	
	
	private void fun1(){
		System.out.println("fun1......");
	}
	
	public int fun2(int age){
		System.out.println("fun2..........");
		return age;
	}
	
	public void fun3(){
		System.out.println("fun3.......");
	}
	
}

在另一个测试代码中

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;

public class GetAndGetdeclared {

	public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, 
		SecurityException, IllegalArgumentException, IllegalAccessException, NoSuchMethodException, 
		InstantiationException, InvocationTargetException {
		
		Class c1 = Class.forName("包名.Person");	//写全包名.类名
		
		//获取构造函数,创建对象
		Constructor c = c1.getConstructor(String.class, int.class);	//获取指定的构造函数
		Person p1 = (Person) c.newInstance("xixi",22);	//通过构造函数,创建了对象
		
		//获得单个属性对象,私有的属性
//		Field f = c1.getField("name");	//getField获取的是公共的属性,获取不了私有的属性,要使用getDeclaredField
		Field f = c1.getDeclaredField("name");
		
		//私有的属性不能直接设置,也不可以获取,回在运行的时候抛出异常
		//要先将f对象设置为可以在类外面设置私有属性的值
		
		f.setAccessible(true);
		System.out.println(f.get(p1));
		f.set(p1, "haha");
		System.out.println(f.get(p1));
		
		
		//获取公用的public属性,包括继承的
		Field fs[] = c1.getFields();
		//遍历
		for(Field ff : fs){
			System.out.println(ff.getName()); 	//获得属性的名字
		}
		
		//获取所有的属性,包括私有的,不包括继承的
		Field fs1[] = c1.getDeclaredFields();
		for(Field ff1 : fs1){
			int num = ff1.getModifiers();	//获取属性的修饰符对应的数字,使用Modifier的toString方法
			System.out.println(ff1.getName()+"---"+Modifier.toString(num));
		}
		
		//同理getMethods()和getDeclaredMethods(),getConstructors()和getDeclaredConstructs()
		//也都是相同的
		
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值