反射

反射reflect
在Java中可以称为"神技",类似于开挂般的存在
方法
Filed
格式:

	Class c = Class.forName("com.lanou.day5.Cat1");
	Object obj = c.newInstance();
	Field[] fs = c.getFields();//守规则的访问
	Field[] fs = c.getDeclaredFields();//使用特权访问,级别压制
	for(Field f : fs) {
		System.out.println(f.getType() + " " + f.getName());
	}

Method
格式:

	Cat1 c = new Cat1();
	Class clazz = c.getClass();
	Method[] method = clazz.getDeclaredMethods();
	for(Method m : method) {
		System.out.println("方法名是:" + m.getName());
		System.out.println("方法返回值类型:" + m.getReturnType());
		System.out.println("方法有多少参数:" + m);
		Parameter[] pa = m.getParameters();
		for(Parameter p : pa) {
			System.out.println("    " + p.getType());
			System.out.println("    " + p.getName());
		}
	}

一些常用的方法和解释
“方法名是:” + m.getName()
“方法返回值类型:” + m.getReturnType()
“方法有多少参数:” + m
调用: .invoke

开挂模式
"开挂"其实就是提高访问权限,不在受私有方法等的限制,

setAccessible开挂的方法:

f.setAccessible(true);
	getDeclaredFiled

访问属性时的开挂

getDeclaredMethod

访问方法时的开挂

泛型擦除
+在泛型底层是不关心放进去的值的类型和泛型的类型是否一致;
但是在应用层取值的时候会关系,若类型不一样,则抛出异常;
在反射过程中,会有泛型擦除,类型不一致也可以
+底层将泛型的类型转为Object来实现,
+Java中是伪泛型,编译后的.class文件中没有泛型
+泛型擦除,反射绕过编译器检查

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值