一、概述
Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。反射机制允许程序在运行时取得任何一个已知名称的class的内部信息,包括包括其modifiers(修饰符),fields(属性),methods(方法)等,并可于运行时改变fields内容或调用methods。那么我们便可以更灵活的编写代码,代码可以在运行时装配,无需在组件之间进行源代码链接,降低代码的耦合度;还有动态代理的实现等等。
二、获取Class对象
Class为字节码类型,字节码文件(xxx.class文件),加载到内存中时,会创建字节码对象(应该是加载到方法区?)。
1、获取方法Class对象的三种方式:
Person person1 = new Person();
Person person2 = new Person();
// 第一种
Class class1 = person1.getClass();
Class class2 = person2.getClass();
System.out.println(class1 == class2);
// 第二种
Class class3 = Person.class;
System.out.println(class3 == class2);
// 第三种
Class class4 = Class.forName("com.example.customer.myjava.Person");
System.out.println(class4 == class3);
结果:
true
true
true
2、Class的成员
(1)、Constructor对象,构造器对象
(2)、Method 对象,成员方法对象
(3)、Field 对象,成员变量对象
Class clazz = Class.forName("com.example.customer.myjava.Person");
try {
/**
* 获取构造器对象
* */
Constructor constructor = clazz.getDeclaredConstructor();
/**
* 因为是私有的 所以要设置为true
* */
constructor.setAccessible(true);
/**
* 创建Person对象
* */
Object obj = constructor.newInstance();
/**
* 获取成员方法
* */
Method eat = clazz.getDeclaredMethod("eat",String.class);
eat.setAccessible(true);
/**
* 执行成员方法
* */
eat.invoke(obj,"fan");
/**
* 获取变量
* */
Field age = clazz.getDeclaredField("age");
age.setAccessible(true);
age.set(obj,3);
Person person = (Person)obj;
System.out.println("age:"+person.getAge());
} catch (Exception e) {
e.printStackTrace();
}
网友评论