反射之属性操作

所使用的实体类:

package reflect;  
  
//定义一个学生类,作为测试项  
public class Student {  
    private String id;  
    public int age;  
    String phone;  
      
    //无参构造方法  
    public Student(){}  
      
    //全参构造方法  
    public Student(String id, int age, String phone) {  
        super();  
        this.id = id;  
        this.age = age;  
        this.phone = phone;  
    }  
      
    //部分参数构造方法  
    public Student(String id, int age) {  
        super();  
        this.id = id;  
        this.age = age;  
    }  
      
    //私有的构造方法  
    private Student(String id) {  
        super();  
        this.id = id;  
    }  
      
    public String getId() {  
        return id;  
    }  
  
    public void setId(String id) {  
        this.id = id;  
    }  
  
    public int getAge() {  
        return age;  
    }  
  
    public void setAge(int age) {  
        this.age = age;  
    }  
  
    public String getPhone() {  
        return phone;  
    }  
  
    public void setPhone(String phone) {  
        this.phone = phone;  
    }  
  
    //定义一个Public方法  
    public void showPublic(){  
        System.out.println("我是公有的方法");  
    }  
      
    //定义一个私有的方法  
    private void showPrivate(){  
        System.out.println("我是私有的方法");  
    }  
      
    //定义一个受保护的方法  
    protected void showProtected(){  
        System.out.println("我是受保护的方法");  
    }  
      
    //定义一个默认的方法  
    void show(){  
        System.out.println("我是默认的方法");  
    }  
      
    //定义一个有返回值的方法  
    public String showReturn(){  
        return "我是有返回值的方法";  
    }  
  
    @Override  
    public String toString() {  
        return "Student [id=" + id + ", age=" + age + ", phone=" + phone + "]";  
    }  
}  

反射操作:

package reflect;

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

//进行测试属性
public class TestFiled {
	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		// 获取类运行时对象方法一
		Class<Student> student = Student.class;
		// 方法二
		//注意此处吃的名字其实是一个字符串,但这个字符串必须是目标类的全路径:包名+类名
		Class<?> studnet1 = Class.forName("day31reflect.Student"); 
		// 方法三,调用Object的方法
		Student s = new Student();
		Class<?> student2 = s.getClass();

		// 获取当前所指向的字节码的名字
		String name = student.getName();
		System.out.println(name);
		System.out.println("----------1-------------------");

		// 获取属性信息
		 //获取属性的方法getFields()
		Field[] fields1 = student.getFields();   //获得的只是public 类型的 
		for (Field field : fields1) {
			System.out.println(field);
		}
		System.out.println("----------2---------------------");

		//如何获取所有属性的全部信息呢?      应用getDeclaredFields(),获取的是具体的属性:包括修饰符、类型、属性名字
		Field[] fields = student.getDeclaredFields();
		for (Field field : fields) {
			System.out.println(field);
		}
		System.out.println("-----------3-----------------------");
		
		//如何获取其中某一个属性,需要通过类来查找        getDeclaredField(String name)
		Field field1 = null;
		try {
			field1 = student.getDeclaredField("age");
		} catch (NoSuchFieldException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//打印
		System.out.println(field1);  
		System.out.println("--------------4-----------------------");
		
		//如何获取每一个属性的修饰符?      应用getModifiers(),返回值是一个int
		for (Field field : fields) {
			int mod = field.getModifiers();
			System.out.println("修饰符为:"+mod+"\t"+Modifier.toString(mod));
			//将返回值转换为具体的修饰符,用其具体的修饰符类Modifier,再通过toString(mod)方法实现
		}
		System.out.println("----------------5---------------------");
		
		//如何获取每一个属性的返回值        应用getType()
		for (Field field : fields) {
			Class<?> type = field.getType();
			System.out.println("返回值为:"+type);
		}
		System.out.println("-------------------6---------------------");
		
		//如何获取属性名字
		for (Field field : fields) {
			String str=field.getName();
			System.out.println("属性名字为:"+str);
		}	
		System.out.println("-----------------7--------------------");
		
		//设置属性值,需要通过构造方法来设置
		//获取对应参数的构造器,如果不存在这样的构造器,则会报出NoSuchMethodException
		 Constructor<Student> stu = student.getDeclaredConstructor(String.class,int.class,String.class);
		//修改访问权限
		 stu.setAccessible(true);
		 //创建对象
		 Student st = stu.newInstance("001",21,"18341******");
		System.out.println(st);
		System.out.println("----------------8-----------------------");
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值