java反射

1、Class类对象

java中万物皆对象,除了平时用的类实例化的对象,还有类本身也是一种对象。class类包含了与类有关的信息。Class对象是在类加载的时候由JVM以及调用类加载器构造的。

类的加载过程:加载→链接(验证→准备→解析)→初始化

加载:

读二进制文件,存到方法区中,创建类对象

链接:

验证

验证二进制文件格式是否正确

准备

解析

初始化数据

初始化:

构建一个默认对象

Student student = new Student();
		Class<?> clazz1 = student.getClass();
		System.out.println(clazz1);
		Class<?> clazz2 =Student.class;
		System.out.println(clazz2==clazz1);
		Class<?> clazz3 = Class.forName("com.qf.cdjava2201.day25.Student");
	    System.out.println(clazz3==clazz1);	

无论哪种方式获取到的对象是一样的
    推荐使用第三种

2、构造函数

反射操作构造函数
Class clazz = Class.forName("com.qf.cdjava2201.day25.Student");
		//操作构造函数--所有的构造
//		Constructor[] cs = clazz.getConstructors();
//		for (Constructor constructor : cs) {
//			System.out.println(constructor);
//		}
		//获取指定的构造函数
		//Constructor c = clazz.getConstructor();//只取public
		Constructor c = clazz.getDeclaredConstructors();//所有这个类中定义的构造
		//System.out.println(c);
		//创建对象
		c.setAccessible(true);//打开对私有的访问权限
		Object stu = c.newInstance();
		System.out.println(stu);
//使用反射调用带参构造创建一个学生


//获取泛型的实际参数
Class<?> clazz = Class.forName("com.qf.cdjava2201.day25.Student");
		Constructor<?>[] dcs = clazz.getDeclaredConstructors();
		for (Constructor<?> c : dcs) {
			Type[] gpts = c.getGenericParameterTypes();	//获取形参
			for (Type gpt :gpts) {
				if(gpt instanceof ParameterizedType) {//判断是否是形式参数
					ParameterizedType t = (ParameterizedType) gpt;					System.out.println(Arrays.toString(t.getActualTypeArguments()));
				}
			}
			//System.out.println(Arrays.toString(gpts));
			//System.out.println(Arrays.toString(c.getParameterTypes()));
			//System.out.println(Arrays.toString(c.getParameters()));
			//System.out.println(c.getParameterCount());//参数数量
			//System.out.println(c.getName());
			//获取访问修饰符
//			int m = c.getModifiers();				
//			System.out.println(m);
}

3、分析方法

访问修饰符   返回值类型   方法名(参数列表){
    
}
clazz.getMethods()://获取到所有public的方法,包括继承的
clazz.getDeclaredMethods()://获取自己类中所有的方法,包括私有的
clazz.getMethod(Class ... parameterTypes)  
clazz.getDeclaredMethod(Class ... parameterTypes) 
    public static void main(String[] args) {
		try {
			Class<?> clazz = Class.forName("com.qf.cdjava2201.day25.Student");
			//获取方法
			//Method[] ms = clazz.getMethods();
			//System.out.println(Arrays.toString(ms));
			Method add = clazz.getDeclaredMethod("add", int.class,int.class);
			//调用方法
			//设置访问权限
			add.setAccessible(true);
			System.out.println(add.getReturnType());
			//调用
			int result = (int) add.invoke(clazz.newInstance(), 10,20);
			System.out.println(result);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		}
	}

4、分析属性

public static final String name = "张三丰";

public static void main(String[] args) throws Exception {
		Class<?> clazz = Class.forName("com.qf.cdjava2201.day25.Student");
        Field f = clazz.getDeclaredField("age");
        f.setAccessible(true);
        Student s1 = (Student) clazz.newInstance();
        f.set(s1, 20);
        System.out.println(f.get(s1));
        System.out.println(f.getName());
        System.out.println(f.getType());
       
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值