Java反射机制详解

本文详细介绍了Java反射机制,包括什么是反射、反射的作用,以及如何加载类、获取构造方法、成员变量、成员方法和配置文件信息。此外,还探讨了如何利用反射越过泛型检查,展示了反射在程序灵活性和配置更新操作中的应用。
摘要由CSDN通过智能技术生成

什么是反射

一般我们获取类的信息是去new一个对象,然后查看、修改它的属性或者运行它的方法。而反射不需要创建对象,就可以单独获取类的构造方法、成员变量、成员方法、main方法等信息,这些操作是通过Class对象完成的,Class类只有一个,其中包含了所有类的信息,当一个类被加载的时候,就会自动为这个类创建一个Class对象,通过这个对象,我们可以得到类的所有信息。

用反射可以干什么

1、获取一个类的所有信息。
2、获取一个接口的常量和方法声明。
3、在程序运行中加载某些类并执行它的方法。
4、在程序运行中创建一些在程序运行期间才知道名字的类的实例。
5、在程序运行期间获取或修改一些对象的成员变量。
6、在程序运行期间检测或执行一些对象的方法。
7、跳过了对象的创建环节,增加了程序的灵活性。
8、利用反射完成一些软件的配置更新操作。

加载类的几种方法

1、代码

	public void getclass()
	{
   
		//第一种方式获取Class对象
		Student st =  new Student();  //同时产生st对象和class对象
		Class<?> stClass1=st.getClass();  //获取Class 对象
		System.out.println(stClass1.getName()); 			
		//第二种,常用,字符串可以传入也可以写在配置文件中
		try {
   
			Class<?> stClass2=Class.forName("com.myf.reflect1229.Student");
			System.out.println(stClass2==stClass1);
		} catch (ClassNotFoundException e) {
   
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
		//第三种
		Class<?> stClass3=Student.class;
		System.out.println(stClass3==stClass1);
	}

2、运行结果

调用了公有,无参构造方法
com.myf.reflect1229.Student
true
true

3、分析:第一种方式需要先创建类的对象,然后通过对象去获取Class类,这并没有体现出反射的优点,我们一般不采用这种方法;第二种方式是最常用的,我们通过一段关于类的位置信息的字符串来加载类,获取Class对象,这样比较直接,也很方便;第三种方式是通过类来获取,虽然少了对象的创建步骤,但还是比不上第二种方法对Class对象的直接获取来的方便。所以,我们一般通过类的位置来加载类,获取Class对象。以上三种方法获取的Class对象是同一个对象。

建一个Student类

Student类包括不同访问修饰符修饰的成员变量,成员方法,构造方法,以便之后运用反射机制来操作这个类。

public class Student {
   
	 public String name;
	 private char gender;
	 protected int age;
	 String number;
	 //默认构造方法
	 Student(String str)
	 {
   
		 System.out.println("默认构造方法:s="+str);
	 }
	 //无参构造方法
	 public Student()
	 {
   
		 System.out.println("调用了公有,无参构造方法");
	 }	 
	 //有一个参数的构造方法
	 public Student(char gender)
	 {
   
		 System.out.println("性别:"+gender);
		 this.gender=gender;
	 }	 
	 //有多个参数的构造方法
	 public Student(String name ,int age)
	 {
   
			System.out.println("姓名:"+name+"年龄:"+ age);
	 }
	 //受保护的构造方法
	 protected Student(boolean n)
	 {
   
		System.out.println("受保护的构造方法:n="+n);
	 }	 
	 //私有的构造方法
	 private Student(int age)
	 {
   
		System.out.println("私有的构造方法:age="+age);
	 }	
	 public String toString()
	 {
   
		return "name:"+name+"gender:"+gender+"age:"+age+"number:"+number;
	 }	
	 /**
	  * 公有的方法
	  * @param s
	  */
	 public void show1(String s)
	 {
   
		 System.out.println("调用了公有的,String参数的方法show1(),s="+s);
	 }	 
	 /**
	  * 受保护的方法
	  */
	 protected void show2()
	 {
   
		 System.out.println("调用了受保护的方法show2()");
	 }	 
	 /**
	  * 私有的,int参数的,有返回值的方法
	  */
	 private String show3(int age)
	 {
   
		 System.out.println("调用了私有的,int参数的,有返回值的方法show3()");
		 this.age=age;
		 return "123";
	 }	 
	/**
	 * 默认无参无返回值的方法
	 */
	 void show4()
	 {
   
		 System.out.println("默认无参,无返回值的方法")
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值