---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流!----------------------
反射类用于制作框架中。有了反射,在配置文件中写的代码才能被解析。
通过反射有三种方法可以加载类:
1、Classclazz=Class.forName("cn.itcast.reflect.Person");
Class类代表某个类的字节码,调用forName方法,加载某个类,返回某个类的字节码;
这句代码执行,就是把硬盘上的Person类加载到了内存中并采用Class类进行封装成为字节码
2、Class clazz1=new Person().getClass();
3、Class clazz2=Person.class;
由于一个类有多个组成部分,例如:成员变量,方法,构造方法等。反射就是加载类,并解剖出类的各个组成部分。
一、解剖反射类的构造函数,创建类的对象。
下面是对于Person类的各种构造函数进行反射的代码:
1、对于公共的无参构造函数public Person(),实现代码如下:
Classclazz=Class.forName("cn.itcast.reflect.Person");//获取类的字节码对象
Constructorc=clazz.getConstructor(null);//获取构造函数对象,参数类型为null
Person p=(Person)c.newInstance(null);//初始化对象,传入的参数是null
2、对于公共的有参构造函数public Person(String name),实现代码如下:
Classclazz=Class.forName("cn.itcast.reflect.Person");
Constructorc=clazz.getConstructor(String.class);//参数类型为String.class
Person p=(Person)c.newInstance("abc");//初始化对象,传入参数是String类型即可
二、解剖反射类的方法
下面是对于Person类的各种方法进行反射的代码:
1、
Class clazz =Class.forName("cn.itcast.reflect.Person");
//第一个参数是方法名,第二个是传入的参数类型,将test方法传入Method对象中
Method method =clazz.getMethod("test", null);
Person p = newPerson();//创建person对象
method.invoke(p,null);//执行方法,第一个参数要指定是哪个对象执行的方法
2、
Class clazz =Class.forName("cn.itcast.reflect.Person");
//同样,第一个参数是方法名,后面的参数按照方法定义的顺序写
Method method =clazz.getMethod("test ", String.class,int.class);
Person p = newPerson();
method.invoke(p,"abc",1111);//执行方法
3、
Class clazz =Class.forName("cn.itcast.reflect.Person");
Method method = clazz.getMethod("test ",String.class,int[].class);
Person p = new Person();
//将返回数据传给cs Class类数组中
Class cs[] = (Class[]) method.invoke(p, "abc",newint[]{1,2,3});
4、
Class clazz =Class.forName("cn.itcast.reflect.Person");
//私有方法使用的是getDeclaredMethod方法。
Method method =clazz.getDeclaredMethod("test ",InputStream.class);
method.setAccessible(true);//暴力反射,强制打开访问权限
Person p = newPerson();
method.invoke(p,newFileInputStream("C:\\1.txt"));
5、
Class clazz =Class.forName("cn.itcast.reflect.Person");
Method method =clazz.getMethod("test",int.class);
method.invoke(null,777);//静态方法调用不需要对象,不过给对象也可以
6、
Class clazz =Class.forName("cn.itcast.reflect.Person");
Method method =clazz.getMethod("main",String [].class);
String []str ={"x","y","z"};
method.invoke(null,(Object)str);//将String数组转化为Object类,就可以运行
三、解剖反射类的字段
1、
public void test1() throwsException{
2、对于私有字段private int password来说,实现代码如下:
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流!----------------------