使用java反射机制,获取已存在类的信息

使用java反射机制,获取已存在类的信息

反射就是把java类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。(其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)
如图是类的正常加载过程:反射的原理在与class对象。
熟悉一下加载的时候:Class对象的由来是将class文件读入内存,并为之创建一个Class对象。

代码示例
1.首先构建Students类

package com.whtcc.person;
public class Students {
	private String stu_name;
	private int stu_age;
	
	public Students() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	public Students(String stu_name, int stu_age) {
		super();
		this.stu_name = stu_name;
		this.stu_age = stu_age;
	}
	
	public String getStu_name() {
		return stu_name;
	}
	public void setStu_name(String stu_name) {
		this.stu_name = stu_name;
	}
	public int getStu_age() {
		return stu_age;
	}
	public void setStu_age(int stu_age) {
		this.stu_age = stu_age;
	}
	
	public void study(int a,int b) {
		System.out.println("学生正在学习。。。计算a+b=="+(a+b));
	}
  
}

2.创建测试类

package com.whtcc.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;

import com.whtcc.person.Students;

public class Main {

	public static void main(String[] args) {
        try {
        	//通过反射获得Students对象
			Class<?> stuClass=Class.forName("com.whtcc.person.Students");
			Students stu2=(Students) stuClass.newInstance();
			//测试是否能调用Students类的study方法
			stu2.study(3,2);
			//获取name_field属性对象
			Field name_field=stuClass.getDeclaredField("stu_name");
			//设置name_field属性对象取消权限检查
			name_field.setAccessible(true);
			//创建Students对象stu1
			Students stu1=new Students("Mary",15);
			//打印stu1的name属性值
			String namestr=(String)name_field.get(stu1);
			System.out.println("stu1的name=="+namestr.toString());
			//修改stu1的name属性值为jike,并输出至控制台
			name_field.set(stu1, "jike");
			String newnamestr=(String)name_field.get(stu1);
			System.out.println("stu1的新name=="+newnamestr.toString());
			//获取age_field属性对象及相关操作
			Field age_field=stuClass.getDeclaredField("stu_age");
			age_field.setAccessible(true);
			System.out.println("stu1对象的age值=="+age_field.getInt(stu1));
			//获取age_field属性修饰符类型
			int modifier=age_field.getModifiers();
			System.out.println("stu1对象的age值修饰符=="+Modifier.toString(modifier));
			//获取age_field属性名称
			System.out.println("stu1对象的age值属性名称=="+age_field.getName());
			System.out.println("-----------------------------------------------------------");
			/*
			 * *通过反射获取并调用对象的方法(以study方法为例)
			 */
			Method method=stuClass.getMethod("study",int.class,int.class);
			//获取study方法的修饰符
			System.out.println("study方法的权限修饰符是"+Modifier.toString(method.getModifiers()));
			//获取study方法的返回值类型
			System.out.println("study方法的返回值类型是"+method.getReturnType().getName());
			//获取study方法的参数列表
			Class<?>[] parameterTypes=method.getParameterTypes();
			System.out.println("参数列表="+Arrays.toString(parameterTypes));
			//调用study方法
			method.invoke(stu1, 6,5);
			//更改stu1对象的属性
			Method setnameMethod = stuClass.getDeclaredMethod("setStu_name", String.class);//第一个参数是方法名称,第二个参数是方法参数类型的类类型
			setnameMethod.invoke(stu1, "tony");
            System.out.println("stu1的新名字是"+stu1.getStu_name());		
			/*
			 * 拓展:使用反射调用ArrayList类的方法
			 */
             Class<?> cla=Class.forName("java.util.ArrayList");
             Method method2=cla.getMethod("add", Object.class);
             ArrayList<String> alt=(ArrayList<String>) cla.newInstance();
             method2.invoke(alt, "we are family");
		     System.out.println(alt);
		        
		   //通过反射获取构造器对象
		     Constructor<?> constructors=stuClass.getConstructor();
		     Constructor<?> constructors1=stuClass.getConstructor(String.class,int.class);
		     Students s1=(Students) constructors.newInstance();
		     Students s2=(Students) constructors1.newInstance("fa",19);		     
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

''如果

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值