Java反射

Java反射

反射:框架设计的灵魂
框架:半成品,可以在框架的基础上进行软件开发,简化编码
反射:将类的各个组成部分封装为其他的对象,这就是反射机制
好处:
1.可以在程序的运行过程中,操作这些对象
2.可以解耦,提高程序的可拓展性

下面我们用一张图来讲述java的反射机制

在这里插入图片描述在这里插入图片描述由图可见将类的各个组成部分封装为一个个对象,成员变量封装为field对象,构造方法封装为con对象,成员方法封装围为method对象

获取Clss对象的三种方式

  1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象
    * 多用于配置文件,将类名定义在配置文件中。读取文件,加载类
  2. 类名.class:通过类名的属性class获取
    * 多用于参数的传递
  3. 对象.getClass():getClass()方法在Object类中定义着。
    * 多用于对象的获取字节码的方式

代码

public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
        Class<?> person = Class.forName("Reflect.Person");
        System.out.println(person);
        Class<Person> personClass = Person.class;
        System.out.println(personClass);
        Person person1 = new Person();
        Class<? extends Person> aClass = person1.getClass();
        System.out.println(aClass);
    }
}

结果

在这里插入图片描述

可见一个类,在一次运行过程中只会被加载一次

那么class对象有什么用呢?

获取功能:
1. 获取成员变量们
* Field[] getFields() :获取所有public修饰的成员变量
* Field getField(String name) 获取指定名称的 public修饰的成员变量

			* Field[] getDeclaredFields()  获取所有的成员变量,不考虑修饰符
			* Field getDeclaredField(String name)  
package Reflect;
import java.lang.reflect.Field;
public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
       //获取class对象
        Class<Person> personClass = Person.class;
        //使用getFields方法获取public修饰的方法
        Field[] fields = personClass.getFields();
        System.out.println("getFields方法:");
        //获取public修饰的成员变量
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("getDeclaredFields方法:");
        //使用getDeclareFields方法获取全部成员变量
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
    }
}

结果:
在这里插入图片描述

		2. 获取构造方法们
			* Constructor<?>[] getConstructors()  
			* Constructor<T> getConstructor(类<?>... parameterTypes)  

			* Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)  
			* Constructor<?>[] getDeclaredConstructors()  
package Reflect;
import java.lang.reflect.Constructor;
public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
       //获取class对象
        Class<Person> personClass = Person.class;
        //获取public 修饰的构造方法
        Constructor<?>[] constructors = personClass.getConstructors();
        System.out.println("Public修饰的构造方法:");
        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor);
        }
        //获取所有构造方法
        System.out.println("所有构造方法:");
        Constructor<?>[] declaredConstructors = personClass.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
        }
    }
}

结果:
在这里插入图片描述

		3. 获取成员方法们:
			* Method[] getMethods()  
			* Method getMethod(String name, 类<?>... parameterTypes)  

			* Method[] getDeclaredMethods()  
			* Method getDeclaredMethod(String name, 类<?>... parameterTypes)  

		4. 获取全类名	
			* String getName()  
			* 
package Reflect;
public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
       //获取class对象
        Class<Person> personClass = Person.class;
        //获取全类名
        String name = personClass.getName();
        System.out.println(name);
    }
}

结果

在这里插入图片描述

Field:成员变量
* 操作:
1. 设置值
* void set(Object obj, Object value)
2. 获取值
* get(Object obj)

		3. 忽略访问权限修饰符的安全检查
			* setAccessible(true):暴力反射

Constructor:构造方法
创建对象:
* T newInstance(Object... initargs)

		* 如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法
package Reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Main {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
       //获取class对象
        Class<Person> personClass = Person.class;
        Person person = new Person();
        Constructor<Person> one = personClass.getConstructor(String.class, int.class);
        System.out.println(one);
        //构造方法1
        System.out.println("构造方法1:");
        Person zhangsan = one.newInstance("zhangsan", 11);
        System.out.println(zhangsan);
        System.out.println("构造方法2:");
        Person person2 = personClass.newInstance();
        System.out.println(person2);
    }
}

结果
在这里插入图片描述

Method:方法对象
执行方法:
Object invoke(Object obj, Object... args)

	 获取方法名称:
		 String getName:获取方法名

以上就是java反射的一些基础知识,如有错误还请各位批评指正,喜欢我的可以点赞收藏,也可以关注呀

在这里插入图片描述

posted @ 2020-07-23 17:15  一只胡说八道的猴子  阅读(320)  评论(0编辑  收藏  举报