您的位置:首页 > 编程语言 > Java开发

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

2015-09-19 10:18 232 查看
反射:反射就是把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;

反射的作用:实现框架功能,通过配置文件获取类完整名,通过反射得到该类,实现功能
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息