反射


title: 反射

反射

  • 是一个非常重要的底层技术,经常应用于框架底层和工具底层
  • 反射可以通过类对象,获取并操作一个类的所有信息

类对象

  • 类的对象:根据类创建出来的实例对象

  • 类对象(Class):类加载的产物,里面放着一个类所有的信息(属性,方法,构造方法,父类,接口)

    • 类加载:JVM第一次使用一个类的时候,会通过ClassPath找到此类的.class文件,并读取.class文件,将此类的信息加载到JVM中,并保存起来(在方法区中),生成一个类对象
    • 八种数据类型也是具有类对象的(获取方式:类型.class;例如:int.class)
  • 获取类对象的三种方式

    • 通过 类名.class获取类对象

      Class c1 = ArrayList.class
      
    • 通过 类的对象.getClass()获取对象

      ArrayList list = new ArrayList();
      Class c2 = list.getClass();
      
    • 通过Class.forName(“类的全限定名”)

      Class c3 = Class.forName("java.util.ArrayList");
      

利用反射获取类信息

  • 类对象 Class

  • getName() 获取类的权限定名

  • getPackage() 获取包名

  • getSuperClass() 获取父类类对象

  • getInterfaces() 获取本类直接实现的接口

  • 属性对象 Field

  • Field getField(String name) 指定获取本类及父类中可继承到的某一个公开属性,name代表属性名

  • Field getDeclaredField(String name) 指定获取本类中的某一个属性,name代表属性名

  • Field[] getFields() 获取本类及父类中所有的公开属性

  • Field[] getDeclaredFields() 获取本类中的所有属性

  • 方法对象 Method

  • Method getMethod(String methodName,Class…) 获取本类及父类可以继承到的某一个公开方法

    • 第一个参数:代表想要获取的方法名
    • 第二个参数:想要获取到的方法的形参列表的Class对象
    • 例如:getMethod(“study”,String.class,int.class,doube.class)
  • Method getDeclaredMethod(String methodName,Class…) 获取本类中的某一个方法,参数含义同上

  • Method[] getMethods() 获取本类及父类可以继承到的所有公开方法

  • Method[] getDeclaredMethods() 获取本类中的所有方法

  • 构造方法对象 Constructor

  • Constructor getConstructor(Class…) 获取本类中的某一个公开构造方法,参数代表构造方法的形参类表的类对象

    • 例如:getConstructor(String.class,int.class);
  • Constructor getDeclaredConstructor(Class…) 获取本类中的某一个构造方法,参数代表构造方法的形参类表的类对象

  • Constructor[] getConstructors() 获取本类中的所有公开构造方法

  • Constructor[] getDeclaredConstructors() 获取本类中的所有公开构造方法

public class Test02 {
	public static void main(String[] args) throws Exception {
		//利用反射破坏封装
		//获得类对象
		Class<Student> c1 = Student.class;
		//用私有的构造方法创建类的对象
		Constructor<Student> cc = c1.getDeclaredConstructor();
		cc.setAccessible(true);
		Student s1 = (Student)cc.newInstance();
		//调用私有的方法
		Method[] mm = c1.getDeclaredMethods();
		for(Method m : mm) {
			m.setAccessible(true);
			m.invoke(s1);
		}
		
		//获得本类中的所有属性
		Field[] f1 = c1.getDeclaredFields();
		for(Field ff : f1) {
			ff.setAccessible(true);
			System.out.println(ff);
		}
	}
}
class Student{
	private String name;
	private int age;
	private Student() {}
	private void run() {
		System.out.println("success");
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值