反射原理及操作

来源:互联网 发布:金融软件测试工程师 编辑:程序博客网 时间:2024/05/22 08:07
反射原理


应用在一些通用性比较高的代码中
后面接触到的框架,大多数都是使用反射来实现的
在框架开发中,都是基于配置文件开发
在配置文件中配置了类,可以通过反射得到类中的所有内容,可以让类中的某个方法来执行
java文件保存到本地硬盘.java
编译成java文件,生成.class文件
使用jvm,把class文件通过类加载加载到内存中
一切都是对象,class文件在内存中使用class类来表示


当时用反射时候,首先需要获取到class类,得到了这个类之后,就可以得到class文件里面的所有内容
-包含属性、构造方法、普通方法
属性通过一个类 Filed表示
构造方法通过一个类 Constructor表示
普通方法通过一个类 Method表示
使用反射操作类里面的属性
首先获取到Class类
Class class1=Person.class;
Class class2=new Person(null, 0).getClass();
Class class3=Class.forName("edu.Person");//常用


//操作无参的构造方法
public void test() throws Exception{
Class class3=Class.forName("edu.Person");
//通过newInstance()方法获取实例
Person p=(Person) class3.newInstance();
p.setAge(12);
System.out.print(p.getAge());
}
//操作有参构造函数
public void test2() throws Exception{
Class class3=Class.forName("edu.Person");
//通过getConstructor()方法获得有参构造方法
Constructor c=class3.getConstructor(String.class,int.class);
//通过有参构造方法设置值
Person p=(Person) c.newInstance("zy",20);
System.out.print(p.toString());
}
//操作属性
public void test3() throws Exception{
Class class3=Class.forName("edu.Person");
//通过getDeclaredField(属性名)方法获取属性
Field f=class3.getDeclaredField("age");
//因为该属性是私有的,所以要设置可以设置私有的权限
f.setAccessible(true);
Person p=(Person) class3.newInstance();
//设置name值,要通过该属性所属的类
f.setInt(p,20);
System.out.print(p.getAge());
}
//操作方法
public void test4() throws Exception{
Class class3=Class.forName("edu.Person");
//通过getDeclaredMethod(方法名,该方法操作的数据类型)方法获取普通方法
Method m=class3.getDeclaredMethod("setName", String.class);
Person p=(Person) class3.newInstance();
//执行该方法,要通过该方法所属的类,后面为该方法传递的值
m.invoke(p,"zy");
System.out.print(p.getName());
}
当操作的方法是静态方法时,因为静态方法调用方式是类名.方法,不需要类的实例,
所以使用反射操作静态方法时,也不需要实例
m.invoke(null,"zy");
1 0
原创粉丝点击