反射

一、反射是什么,有什么作用?

  反射—在程序运行的过程中,我们可以得到某个类的对象,可以调用某个类中的任何一个变量/方法,这种动态获取信息的过程就是反射。
  当我们在没有见过某个类的情况下,仅凭一个完整的类名,就可以获取到整个类的所有信息。
反射的使用场景:
  1、jdbc加载数据库驱动
  2、Servlet的web.xml配置
  3、Spring框架

二、实例对象与反射对象的相互转换?

  实例对象-----就是我们通过类创建的对象
  反射对象-----通过反射机制得到的类对象
例如: 反射就是一面镜子,镜子前面的你就是实例对象,通过镜子得到的镜子里面的你就是反射对象。
  反射对象是一个Class类型的对象
  Class—不是创建类的关键字,表示一个类,所以反射对象是一个Class类型的对象
  public final class Class

  1. 通过实例对象得到反射对象
package com.wangxing.test1;
public class TestMain {
	public static void main(String[] args) {
		//1.通过实例对象得到反射对象
		Student  stu1=new Student();
		//通过实例对象的getClass()得到,当前实例对象对应的反射对象
		Class stuclass=stu1.getClass();
	//当我们没有实例对象时,我们可以用过类名【包名+类名】得到这个类的反射对象
		//通过Class类的forname(类名【包名+类名】)
		try {
			Class stu1class=Class.forName("com.wangxing.test1.Student");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}
  1. 通过反射对象得到实例对象
try {
	Class stu1class=Class.forName("com.wangxing.test1.Student");
	Student stu2=(Student)stu1class.newInstance();
	stu2.info();
} catch (Exception e) {
	e.printStackTrace();
}

三、通过反射对象得到构造方法\成员变量\成员方法

Constructor<?>[]getConstructors() 得到构造方法
Field[]getDeclaredFields() 得到成员变量
Method[]getDeclaredMethods() 得到成员方法
Class<?>[]getInterfaces() 得到接口
Class<? super T>getSuperclass() 得到父类
PackagegetPackage() 得到包对象
intgetModifiers() Java语言修饰符 Modifier的toString(int mod)
StringgetName() 得到类名称

四、反射的应用

package com.wangxing.test1;

public interface MyInterFace {

}

package com.wangxing.test1;

public class Person {

}

package com.wangxing.test1;
public class Student extends Person implements MyInterFace {
	public  Student() {}
	private String  name="zhangsan";
	public  void  info() {
		System.out.println("Student类的实例方法");
	}
}

package com.wangxing.test1;

public class TestMain {

	public static void main(String[] args) {
		//1.通过实例对象得到反射对象
		Student  stu1=new Student();
		//通过实例对象的getClass()得到,当前实例对象对应的反射对象
		Class stuclass=stu1.getClass();
		//当我们没有实例对象时,我们可以用过类名【包名+类名】得到这个类的反射对象
		//通过Class类的forname(类名【包名+类名】)
		try {
			Class stu1class=Class.forName("com.wangxing.test1.Student");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		//2.通过反射对象得到实例对象
		try {
			Class stu1class=Class.forName("com.wangxing.test1.Student");
			Student stu2=(Student)stu1class.newInstance();
			stu2.info();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

package com.wangxing.test2;

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

public class TestMain {

	public static  String  getMyName(String name) {
		String newname="";
		int dianindex=name.lastIndexOf(".");
		newname=name.substring(dianindex+1);
		return newname;
	}
	public static void main(String[] args)throws Exception {
		String stuname="com.wangxing.test1.Student";
		Class  stuclass=Class.forName(stuname);
		//得到类的包名称
		String packagenamre=stuclass.getPackage().getName();
		System.out.println("package  "+packagenamre+";");
		//得到类的修饰符
		String classxiushifu=Modifier.toString(stuclass.getModifiers());
		//得到类名
		String stuclassname=getMyName(stuclass.getName());
		//得到父类的名称
		String stusuperclassname=getMyName(stuclass.getSuperclass().getName());
	    //得到接口名称
		String interfaceName=getMyName(stuclass.getInterfaces()[0].getName());
		System.out.println(classxiushifu+" class "+stuclassname+" extends "+
		stusuperclassname+" implements "+interfaceName+"{");
		//得到构造方法
		Constructor  gouzaofangfa=stuclass.getConstructors()[0];
		//得到构造方法的修饰符
		String gouzaoxiushifu=Modifier.toString(gouzaofangfa.getModifiers());
		String gouzaoName=getMyName(gouzaofangfa.getName());
		System.out.println("\t"+gouzaoxiushifu+" "+gouzaoName+"(){}");
	    //得到成员变量
		Field  bianliang=stuclass.getDeclaredFields()[0];
		String bianliangxiushifu=Modifier.toString(bianliang.getModifiers());
		String bianliangtype=getMyName(bianliang.getType().getName());
		String bianliangname=bianliang.getName();
		System.out.println("\t"+bianliangxiushifu+" "+
				bianliangtype+" "+bianliangname+"=\"zhangsan\";");
		//得到方法
		Method fangfa=stuclass.getDeclaredMethods()[0];
		String fangfaxiushifu=Modifier.toString(fangfa.getModifiers());
		String fangfareturntype=getMyName(fangfa.getReturnType().getName());
		String fangfaname=fangfa.getName();
		//fangfa.getParameters()  得到方法参数
		//fangfa.getExceptionTypes() 得到方法的声明抛出的异常类型
		System.out.println("\t"+fangfaxiushifu+" "+
				fangfareturntype+" "+fangfaname+"(){");
		System.out.println("\t\tSystem.out.println(\"Student类的实例方法\")");
		System.out.println("\t\t}");
		System.out.println("}");
	}
}

运行结果:

在这里插入图片描述

总结

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值