反射技术学习笔记
文章目录
一、反射介绍
1.什么是反射
Java 反射机制是 Java 语言一个很重要的特性,它使得 Java 具有了“动态性”。在 Java
程序运行时,对于任意的一个类,我们能不能知道这个类有哪些属性和方法呢?对于任意的
一个对象,我们又能不能调用它任意的方法?答案是肯定的!这种动态获取类的信息以及动
态调用对象方法的功能就来自于 Java 语言的反射(Reflection)机制。
2.反射的作用
简单来说两个作用,RTTI(运行时类型识别)和 DC(动态创建)。
我们知道反射机制允许程序在运行时取得任何一个已知名称的 class 的内部信息,包括
其 modifiers(修饰符),fields(属性),methods(方法)等,并可于运行时改变 fields 内容或调用methods。那么我们便可以更灵活的编写代码,代码可以在运行时装配,无需在组件之间进行源代码链接,降低代码的耦合度;还有动态代理的实现等等;但是需要注意的是反射使用不当会造成很高的资源消耗!
二、创建对象过程
1.创建 Java 对象的三个阶段
2.创建对象时内存结构
实际上,我们在加载任何一个类时都会在方法区中建立“这个类对应的 Class 对象”,
由于“Class 对象”包含了这个类的整个结构信息,所以我们可以通过这个“Class 对象”
来操作这个类。
我们要使用一个类,首先要加载类;加载完类之后,在堆内存中,就产生了一个 Class 类
型的对象(一个类只有一个 Class 对象),这个对象就包含了完整的类的结构信息。我们可
以通过这个对象知道类的结构。这个对象就像一面镜子,透过这个镜子可以看到类的结构,
所以,我们形象的称之为:反射。 因此,“Class 对象”是反射机制的核心。
三、获取Class对象的三种方式
首先,创建Users类
public class Users {
private String username;
private int userage;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getUserage() {
return userage;
}
public void setUserage(int userage) {
this.userage = userage;
}
}
1.通过getClass()方法获取Class对象
//获取Class对象的三种方式_getClass()方法
public class GetClass1 {
public static void main(String[] args) {
Users users = new Users();
Class clazz = users.getClass();
Class clazz2 = users.getClass();
System.out.println(clazz);
System.out.println(clazz.getName());
System.out.println(clazz == clazz2);
}
}
2.通过.class静态属性获取Class对象
//通过.class静态属性获取Class对象
public class GetClass2 {
public static void main(String[] args) {
Class clazz = Users.class;
Class clazz2 = Users.class;
System.out.println(clazz);
System.out.println(clazz.getName());
System.out.println(clazz == clazz2);
}
}
3.通过Class.forName(“class Name”)方法获取Class对象
//通过Class.forName("class Name")获取Class对象
public class GetClass3 {
public static void main(String[] args) throws Exception{
Class clazz = Class.forName("Reflection.Users");
Class clazz2 = Class.forName("Reflection.Users");
System.out.println(clazz);
System.out.println(clazz.getName());
System.out.println(clazz == clazz2);
}
}
四、获取类的构造方法
1.方法说明及使用
//获取类的构造方法_方法说明及使用
public class GetConstructor {
public static void main(String[] args) throws Exception{
Class clazz = Users.class;
Constructor[] arr = clazz.getDeclaredConstructors();
for (Constructor c:arr){
System.out.println(c);
}
System.out.println("---------------------------------");
Constructor[] arr1 = clazz.getConstructors();
for (Constructor c:arr1){
System.out.println(c);
}
System.out.println("----------------------------------");
Constructor c = clazz.getDeclaredConstructor(int.class);
System.out.println(c);
System.out.println("===============================");
Constructor c1 = clazz.getConstructor(null);
System.out.println(c1);
}
}
2.通过构造方法创建对象
//通过构造方法创建对象__constructor.newInstance()方法
public class GetConstructor2 {
public static void main(String[] args) throws Exception{
Class clazz = Users.class;
Constructor constructor = clazz.getConstructor(String.class,int.class);
Object o = constructor.newInstance("Corey",18);
Users users = (Users)o;
System.out.println(users.getUsername()+"\t"+users.getUserage());
}
}
五、获取类的成员变量
1.方法说明及使用
//获取类的成员变量_方法说明及使用
public class GetField {
public static void main(String[] args) throws Exception{
Class clazz = Users.class;
Field[] field =clazz.getFields();
for (Field f:field ){
System.out.println(f);
System.out.println(f.getName());
}
System.out.println("=======================");
Field[] field1 = clazz.getDeclaredFields();
for (Field f:field1){
System.out.println(f);
}
System.out.println("----------------------");
Field field2 = clazz.getField("userage");
System.out.println(field2.getName());
System.out.println("===================");
Field field3 = clazz.getDeclaredField("username");
System.out.println(field3.getName());
}
}
2.操作成员变量
//获取类的成员变量_操作成员变量
public class GetField2 {
public static void main(String[] args) throws Exception{
Class clazz = Users.class;
Field field = clazz.getField("userage");
//对象实例化
Object obj = clazz.newInstance();
//为成员变量赋予新的值
field.set(obj,18);
//获取成员变量的值
Object o = field.get(obj);
System.out.println(o);
}
}
六、获取类的方法
1.方法说明及使用
//获取类的方法_方法说明及使用
public class GetMethod {
public static void main(String[] args) throws Exception{
Class clazz = Users.class;
//此方法会get包括继承Object的方法
Method[] methods = clazz.getMethods();
for (Method m:methods){
System.out.println(m);
System.out.println(m.getName());
}
System.out.println("----------------------------");
Method[] methods1 = clazz.getDeclaredMethods();
for (Method m:methods1){
System.out.println(m.getName());
}
System.out.println("=======================");
Method method = clazz.getMethod("setUserage", int.class);
System.out.println(method.getName());
System.out.println("-------------------------");
Method method1 = clazz.getDeclaredMethod("sayhello");
System.out.println(method1.getName());
}
}