Java知识整理(十二)之反射

反射:反射就是把java类中的各种成分映射成相应的java类
Class(反射的基石)-->Class类代表java类
Class cla1 = Date.class(字节码得到对象)
得到字节码对应对象的3种方法:1.类名.class;2.对象.getClass();例如:new Date().getClass();3.Class.forName("类名");例如Class.forName("java.lang.String");
3种方法得到的对象是同一个对象,无论用来得到该对象的对象(对象.getClass();)是否是同一个。用 == 比较两个字节码是否是同一个因为是字节码,一种只有一份
Class.forName("java.lang.String");//得到类的字节码;字节码:把字节码加载到内存中,再用字节码复制出一个个对象
9个预定义的Class实例对象,8个基本类型(cls.isPrimitive())+void
int.class==Integer.TYPE;int类型得到的对象和Integer类型得到的基本类型对象是同一个(8种)
数组类型(每种数组都有各自Class实例对象)的Class实例对象:cls.isArray();
只要在源程序中出现的类型都有各自的Class实例对象,例如:int[],void...
Field:类的成员变量
Field fieldY = pt1.getClass().getField("y"); //由pt1.getClass()得到这个类,再getField("y")得到该类的成员变量(只能得到public不能得到private);
Field fieldY = pt1.getClass().getDeclareField("y");//得到私有的成员变量需要用getDeclareField("y");
上面虽然得到了私有的成员变量,但是不能用,还要调用一个方法:fieldY.setAccessible(true);暴力反射
fieldY.get(pt1);得到pt1对象的该成员方法的值,Object类型;fieldY.set(obj,newValue);设置该对象该变量的值
field.getType();得到该变量的字节码;field.set(pt1,value);设置pt1对象的field变量的值;
Method:方法;得到一个Method对象就得到了一个Method方法
Method method = String.class().getMethod(name,parameterTypes); //先得到字节码对象,再根据方法名和参数得到方法
method.invoke(str,1);该方法被str调用,参数是1;如果调用静态方法:method.invoke(null,1);
这里如果参数是一个数组,不能直接写成数组,jdk1.4会自动把数组拆成几个参数,要写成:new Object[] {new int[]{1,2,3}}或者(Object)new int[]{1,2,3};int[]就没关系,因为int[]不是Object[]类型
Contructor:构造器
得到所有构造方法:Constructor constructors[] = Class.forName("java.lang.String").getConstructors();
得到单个构造方法:Constructor constructor = Class.forName("java.lang.String").getConstructors(StringBuffer.class,...);根据参数类型来确定是哪个构造方法
创建实例对象(反射方式):String obj = (String)constructor.newInstance(new StringBuffer("abc"));//得到的是obj对象,需要强转,获得构造器,创建对象
String obj = (String)Class.forName("java.lang.String").newInstance();//得到默认的构造方法并创建实例对象
Package:包
数组的反射:clazz.isArray();Array.getLength(obj);Array.get(obj.i);//java.lang.reflect.Array;
反射的作用:实现框架功能,通过配置文件获取类完整名,通过反射得到该类,实现功能
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值